我正在使用fgets();
我有一个循环:while(!feof(fp))
问题是,即使在我到达并读取最后一行之后程序仍然进入循环,并且在调试文件中,ptr只显示点而不是数据字符串。
我怎样才能知道我已经到了最后而不是再次进入循环?
while (!feof(fp)) {
if (strcmp(data2->ID ,data1->ID)<0) {
fseek(fp, backTo, SEEK_SET);
fprintf( fp, "%s",lin2);
fprintf( fp, "%s",lin1);
flag = 1;
}
else
{
strcpy(data1->ID,data2->ID);
strcpy(data1->name,data2->name);
data1->price=data2->price;
}
if(fgets(line2, sizeof(line2),fp)!=NULL)
{
itemSize2=strlen(line2)+1;
strcpy(data2->ID,strtok (line2,","));
}
}
文本文件中只有2行,我正在使用fseek并转到文件的开头,然后我使用fprintf两次并在那些行上写,之后我应该到达EOF
答案 0 :(得分:4)
你的意思是它一次进入循环吗?
如果程序试图读取超出文件末尾的内容,则 feof(fp)
返回true,而不是在读取它时。系统不一定知道是否有更多的文件(它可能是动态生成的,stdin
是规范示例),但确实知道它是否到达文件末尾。
您需要在每个feof(fp)
之后测试fgets(fp)
,或者测试fgets(fp)
返回的字符数,或者执行单字符get
和{{ 1}}。
答案 1 :(得分:-1)
我使用这个自定义函数....
BOOL CheckFileEnd(FILE *fp)
{
BOOL res;
long currentOffset = ftell(fp);
fseek(fp, 0, SEEK_END);
if(currentOffset >= ftell(fp))
res = TRUE;
else
res = FALSE;
fseek(fp, currentOffset, SEEK_SET);
return res;
}