C fgets buffersize
我有一个用C语言编写的程序,该程序读取带有缓冲区的文件:
1 2
| char buffer [65536];
while(fgets(buffer ,65536,inputFile )){... } |
现在我有一些问题:
如果文件大小小于缓冲区大小会怎样?
fgets()是否会覆盖整个缓冲区,所以如果前一个缓冲区(buffer1)已满,而下一个缓冲区(buffer2)(例如大小为10)未满,则该缓冲区中是否仍会包含buffer1的字符,例如在buffer2 [ 20] = buffer1 [20],因为它没有覆盖?
如何知道缓冲区中有多少个字符,因此可以向后循环缓冲区
-
通过查看man fgets可以回答所有这些问题。
-
@fangio使用前请阅读功能说明。
-
(1)缓冲区未装满。 (2)仅显示一个缓冲区; 我们无法猜测代码如何与buffer1和buffer2交互。 (3)在结尾处有一个空字节,可能在换行符之后。 一行中间可能有空字节; 没有办法可靠地发现这一点。 如果需要可靠地知道长度,请使用POSIX函数getline(),因为它会报告读取的长度(也将为您管理内存)。
-
另请注意,fgets遇到换行符时将停止读取。 如果要读取整个文件,请查看fread。
要回答您的问题,首先您必须了解fgets(3)。它一次读取一行,到达换行符或EOF后fgets()返回。并附加" \ 0"以终止字符串。我回答您的问题如下...
通常,fgets()一次只获取一行字符串,而不是整个文件。在您的代码中,这意味着该行的最大长度为65535 +'\ 0'使65536,这被认为太长。要读取文本文件,通常必须将fgets()放入for()或while()循环中,直到达到EOF(缓冲区== NULL)为止。
如果读取的行比缓冲区的长度长,它将只读取缓冲区的长度-1个字符,然后追加'\ 0'。
strlen(3)将为您提供字符串的长度。
正如评论所建议的,man可以在这里提供帮助,也可以在Google上提供帮助...来自cppreference
Reads at most count - 1 characters from the given file stream and stores them in the character array pointed to by str. Parsing stops if end-of-file occurs or a newline character is found, in which case str will contain that newline character. If no errors occur, writes a null character at the position immediately after the last character written to str.
并且:
Return value: str on success, null pointer on failure.
基本上,数字是您读取的字符数+1。通常,您不会吞噬整个生产线,而只会吞噬其中的一部分。在任何情况下,缓冲区都有一个空终止符,您可以继续读取直到EOF。
-
因此,例如,如果文件为" hello",并且buffersize为100,则缓冲区将包含" hello",并且buffer [5] = \ 0,还是我错了?
-
你是对的。 如果文件是" hello \ nblabla",则将进行两次迭代等。