【问题标题】:feof, doesn't seem to work - text filesfeof,似乎不起作用 - 文本文件
【发布时间】:2011-03-18 16:39:42
【问题描述】:

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

【问题讨论】:

  • 简化你的代码,看看 feof 是否仍然行为不端。对于初学者, fset 可能会重置 eof 标志。

标签: c


【解决方案1】:

你的意思是它进入循环一次?

feof(fp) 如果程序试图读取超出文件末尾的内容,则返回 true,而不是在读取到文件末尾时返回 true。系统不一定知道是否还有更多文件(它可能是动态生成的,stdin 是典型示例),但确实知道它是否到达文件末尾。

您需要在每个fgets(fp) 之后测试feof(fp),或者测试fgets(fp) 返回了多少个字符,或者执行一个字符getunget

【讨论】:

  • 它一直进入循环,不知道何时到达文件末尾
  • @Nadav:你能说得更准确点吗?它是在读取最后一个输入后进入while 循环体一次,还是在同一次运行中多次进入?
  • 有一个 fseek 调用将文件 ptr 2 行向上,文件中只有 2 行,我使用 fprintf 覆盖它们,在我覆盖它们之后我使用 fgets 然后我应该 rach eof,但它会永远在 while 循环中进行
  • 我认为您误解了文件的工作方式。它们基于字节,而不是行,所以如果你用更短的内容覆盖最后两行,仍然会留下旧文件内容的结尾。此外,在 C 语言中,在没有中间搜索的情况下,不可能在 FILE 上的读取和写入之间切换。尝试这样做会导致未定义的行为,您可能会看到这种行为。
【解决方案2】:

嗯,我用这个自定义函数....

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多