/*
有文件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;
}
}
这个需要建立在知道一行长度的基础上。
我其实不是想知道其他复制方法,而是想知道上面代码里为何用fgetc不行,是哪出了问题。