首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >fgetc总是返回EOF

fgetc总是返回EOF
EN

Stack Overflow用户
提问于 2014-09-18 17:28:07
回答 1查看 1.5K关注 0票数 0

在试图计算文本文件中的行数时,我注意到fgetc总是返回EOF。这段代码在Freebsd 10上运行,但现在它不在Mac上工作。我检查了这个文件,看看它是否是空的,它不是,它大约有1KB大小,包含16行。我在文件的开头添加了一行,认为这是问题所在,但它仍在返回EOF。那么为什么fgetc总是返回EOF呢?

代码语言:javascript
复制
 int getLines(int listFd, int *lines)
 {

     /* Declarations */
     *lines = 0;
     int ch;
     FILE *list;

     /* Get File Stream */
     list = fdopen(listFd, "r");
     if(list == NULL)
     {
         printf("Can't Open File stream\n");
         return -1;
     }

     /* Seek To beginning Of file */
     fseek(list, 0, SEEK_SET);

     /* Get Number of Lines */
     while(!feof(list))
     {
         ch = fgetc(list);
         if(ch == '\n')
         {
             lines++;
         }

         else if(ch == EOF)
         {
             break;
         }
     }

     printf("lines: %d\n", *lines);

     /* Clean up and Exit */
     fclose(list);

    return 0;
}
EN

回答 1

Stack Overflow用户

发布于 2014-09-18 18:06:41

fgetc()最终应该返回EOF。代码的另一个问题当然是混淆了行为和诊断。很好地测试IO功能的结果。

代码语言:javascript
复制
int getLines(int listFd, int *lines) {
  ...
  *lines = 0;
  ...
  if (fseek(list, 0, SEEK_SET)) puts("Seek error");
  ...
    ch = fgetc(list);
    if (ch == '\n') {
      // lines++;
      (*lines)++;  // @R Sahu 
    }
   ...
   printf("lines: %d\n", *lines);

   if (ferror(list)) puts("File Error - unexpected");
   if (feof(list)) puts("File EOF - expected");
}

其他东西:

下面的代码是对文件结束条件的冗余测试。

代码语言:javascript
复制
/* Get Number of Lines */
while(!feof(list)) {
  ch = fgetc(list);
  ...
  else if(ch == EOF) {
    break;
  }
}

建议简化(@Keith )

代码语言:javascript
复制
 /* Get Number of Lines */
 while( (ch = fgetc(list)) != EOF) {
   if(ch == '\n') {
     (*lines)++;
   }
 }

关于文件行计数的一些小问题:如果文件在最后的'\n'之后有文本,那么它会算作一行吗?建议:

代码语言:javascript
复制
*lines = 0;
int prev = '\n'; 
/* Get Number of Lines */
while( (ch = fgetc(list)) != EOF) {
  if(prev == '\n') {
    (*lines)++;
  }
  prev = ch;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25918894

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档