C语言文件读写。fscanf,fprintf,fgetc,fputc的使用遇到些问题

/*
有文件A.txt,内容
23 44 84 64 84 25
25 44 45 74 80 67
14 25 48 61 65 54
25 44 14 19 45 74
12 77 45 96 47 25
用C语言编程实现:读文件中25开头的行,并将其写入B.txt中。
*/
#include <stdio.h>
#define MAX 50 //A文件中一行最多的数字个数
int main(){
int a,b[MAX],i,j;
//char line[MAX];
char x;
FILE *fp = fopen("A.txt","r");
FILE *fp2 = fopen("B.txt","w");
FILE *fp3 = fopen("C.txt","w"); //测试用文件

while(!feof(fp))
{
fscanf(fp,"%d",&a);
if (a != 25)
{
//fscanf(fp,"%*[^\n]%*c"); //这个可以。正则表达式,意思是忽略(前面的星号表示)换行符之前的字符(^\n表示),并且忽略换行符(%*c表示)
// /* 为何这个不行 ????? 中间文件数据也正确,感觉就是fp2没写入,我用的工具是C-Free 5.0. 是否有全部参数都能跟踪的工具?
while(true)
{
x = fgetc(fp);
fputc(x,fp3); //测试用中间文件
if ( x == '\n')
{
break;
}

}
// */
}
else
{
b[0] = a;
for (i = 1;!feof(fp);i++)
{
fscanf(fp,"%d",b+i);
fprintf(fp3,"The b[%d] is %d\n", i,b[i]); //测试用中间文件
//fflush(stdin);
if(fgetc(fp) == '\n')
{
break;
}
}
for (j = 0;j <= i;j++)
{
fprintf(fp2,"%d ",b[j]);
}
fputc('\n',fp2);
}
}
fclose(fp);
fclose(fp2);
fclose(fp3);

return 0;
}
自己找出原因来了,是因为没有考虑到最后一行不是\n,而是EOF的原因。
while(true)
{
x = fgetc(fp);
fputc(x,fp3); //测试用中间文件
if ( x == '\n'|| x == EOF)
{
break;
}

}

先用fgets(str, sizeof(str), fp )读一行,
然后检查前两个字符是不是25:if ( str[0]=='2' && str[1]=='5' ) fputs( str, fp2 );
就可以了!追问

这个需要建立在知道一行长度的基础上。
我其实不是想知道其他复制方法,而是想知道上面代码里为何用fgetc不行,是哪出了问题。

追答试试这段代码
#include <stdio.h>
#define MAX 50  //A文件中一行最多的数字个数
int main(){
int a,b[MAX],i,j;
char x;
FILE *fp = fopen("A.txt","r");
//LE *fp2 = fopen("B.txt","w");
FILE *fp2=stdout;

while(!feof(fp))
{
fscanf(fp,"%d",&a);
if (a != 25)

while(true)
{
x = fgetc(fp);
if ( x == '\n')
{
break;
}
if ( feof(fp) ) //如果最后一行没有换行符,会死在这里!!!
break ;
}
}
else
{
b[0] = a;
for (i = 1;!feof(fp);i++)
{
fscanf(fp,"%d",b+i);
if(fgetc(fp) == '\n')
{
break;
}
}   
for (j = 0;j <= i;j++)
{
fprintf(fp2,"%d ",b[j]);   
}
fputc('\n',fp2);
}
}
fclose(fp);
//fclose(fp2);

return 0; 
}

温馨提示:答案为网友推荐,仅供参考
相似回答