【发布时间】:2014-09-18 17:28:07
【问题描述】:
在尝试计算文本文件中的行数时,我注意到 fgetc 总是返回 EOF。此代码在 Freebsd 10 上运行,但现在它不适用于 Mac OSX。我检查了文件看它是否为空,它不是,它的大小约为 1 KB,包含 16 行。我添加了一行来寻找文件的开头,认为这是问题所在,但它仍然返回 EOF。那么为什么 fgetc 总是返回 EOF?
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;
}
【问题讨论】:
-
feof循环有什么用? -
由于
line++;,您可能遇到了未定义的行为。那应该是++(*line);。 -
不要使用
feof来确定何时终止循环。使用fgetc返回的值。 (您可以在循环终止后调用feof和/或ferror来了解为什么它会终止。)常见的成语是while ((ch = fgetc(list)) != EOF) { /* ... */ } -
您传入一个文件描述符并使用
fdopen打开一个引用它的FILE*。为什么不首先使用FILE*?该文件描述符来自哪里,它指的是什么?您说“文件”存在并且大小约为 1KB -- 什么文件?