【问题标题】:How to determine end of file? [duplicate]如何确定文件的结尾? [复制]
【发布时间】:2019-02-01 23:29:57
【问题描述】:

如何判断文件结束?

FILE* cfl;
if ((cfl=fopen(csv, "r")) == NULL) {
    printf("Cannot open file for read.\r\n");
    exit(1);
}
while (!feof(cfl)) {
    int i = 0;
    char* buf = (char*)malloc(sizeof(char));
    while ((buf[i] = fgetc(cfl)) != '\n') {
        i++;
        buf = (char*)realloc(buf, sizeof(char)*(i+1));
        printf("=%d= ", i);
    }
    buf[i] = '\0';
    printf("+%d+ ", i);
    printf("%s\r\n", buf);
   free(buf);
}

fclose(cfl);

一切正常到最后一行。由于文件在最后一个换行符后结束,所以程序循环在while ((buf[i] = fgetc(cfl)) != '\n') {...}

我可以在检查"i"是否不超过某个大值后中断循环,但会出错。如何正确判断文件的结尾以及为什么 feof 在这种情况下不起作用?

【问题讨论】:

  • 在内部 while 循环中根本不检查 endof 文件。
  • 另外,fgetc() 返回 int,而不是 char。如果将fgetc() 的结果读入char,则无法可靠地检测到EOF。
  • 不确定是不是骗子
  • 与您的问题没有直接关系,但是为您正在读取的每个字符重新分配一个新的缓冲区是非常低效的。您应该重新分配至少 64 KB 的块。

标签: c


【解决方案1】:

fgetc 函数返回一个int,文件末尾的值为EOF。这是典型的做法:

int c;
while ((c = fgetc(cfl)) != EOF) {
    ...
}

【讨论】:

  • 谢谢。我会用这个。它对我来说很好。
  • 请注意,您必须使用 feof 才能知道 fgetc 返回的 EOF 是“文件结束”还是“错误”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-11
  • 1970-01-01
  • 2019-08-12
  • 2023-03-16
  • 1970-01-01
  • 2019-09-09
相关资源
最近更新 更多