-1

我提前道歉,因为我刚开始学习 C。这是我到目前为止的代码。

int main ()
{
char buf [4];
// open the file
FILE *fp = fopen("readme","r");

// Return if could not open file
if (fp == NULL)
    return 0;

while(fgets(buf,4,fp) != NULL){

    // Checking for end of file
    if (feof(fp))
        break ;

    fputs(buf,stdout);
}  while(1);

fclose(fp);
return(0);
}

我无法获得所需的结果。我假设将缓冲区设置为 4 可能会返回每行的前四个字符。我可能是错的,但我已经坚持了几个小时试图弄清楚如何溢出缓冲区。感谢任何帮助,谢谢!

4

1 回答 1

2

您不了解如何fgets工作。

fgets最多可读取 3 个字符(而不是 4 个,因为fgets'\0' - 终止缓冲区)。如果换行符'\n'在这 3 个之间, fgets将停止读取和写入换行符并返回,否则继续直到缓冲区已满。

假设输入是: This is a very long line\nThis is another line\n,那么fgets将读取前 3 个字符并将'T', 'h', 'i', 存储'\0在缓冲区中。下一次fgets读取接下来的 3 个字符: 's'' ''i'并将它们存储在缓冲区中。最终它将到达第一个换行符,并停止在那里阅读。

通常fgets会尝试读取缓冲区可以容纳的最大字符数。如果换行符在这些字符中,它也会停止读取并在缓冲区中写入换行符。如果其中没有找到换行符,则fgets当缓冲区满时停止。

是否fgets读取整行取决于缓冲区的大小,因此即使连续两次调用fgets,您可能仍无法获得整行,正如我在上面的示例中向您展示的那样。这就是为什么您假设 我假设将缓冲区设置为 4 可能会返回每行的前四个字符是错误的。

知道是否读取整行的唯一方法fgets是查看换行符是否写入缓冲区。

另请注意

if (feof(fp))
    break ;

这里不需要,因为当到达文件结尾并且无法读取更多字符时fgets将返回,循环无论如何都会结束,所以做额外的检查是没有意义的。NULL

和这个

while(fgets(buf,4,fp) != NULL){
    ...
} while(1);

与此相同:

while(fgets(buf,4,fp) != NULL){
    ...
}

while(1);

因此,在阅读了整个文件后,您将进入一个无限循环。

于 2018-02-23T20:25:28.797 回答