feof,似乎不起作用 - 文本文件

时间:2011-03-18 16:39:43

标签: c

我正在使用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

2 个答案:

答案 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;
}