2013-12-11 41 views
0

比方说,我有一个包含长度为10的字符串文件:C - fgets() - 如果字符串更长?

ABCDEFGHIJ

而且读通过fgets()大小为4 的缓冲管线我的文本文件中的行我会打电话给fgets()在循环以确保整行被读取。 但是,在第一次通话时,它会读取前3个字符(buffer size -1)对不对?它是否会在我的4字符缓冲区的最后位置附加一个空的终止字符,即使我的字符串的实际末尾还没有到达,还是会在我的缓冲区末尾填充4个字符并且没​​有空终止字符?哪个会打电话给strlen()不可能?

谢谢:)

+3

最好的方法来知道这样一个简单的问题是试试看:) – EoiFirst

+0

没有最好的方式将它写在标准库文档中。 – Virus721

+2

由于您没有在文档中找到它,请编写3行代码,您将会知道,而不是等待这里的答案。 – EoiFirst

回答

1

综观与fgets的人页面,您可以看到:

“新行,如果有的话,被保留。如果任何字符阅读并 没有错误,一个'\ 0' 字符被附加到结束字符串”

http://www.manpagez.com/man/3/fgets/

+0

感谢您的帮助。 – Virus721

1

从C标准草案(2010)n1547.pdf,7.21.7.2.2:

fgets函数最多读取一个比由流指向的流所指定的字符数为 的字符数少 指向由s指向的数组 。 新行字符(保留)或文件结束后不会读取其他字符。在将最后一个字符读入 数组后立即写入空字符 。

5

在文档中。

man fgets从逐字(斜体由我):

与fgets()至多一个小于大小的字符从流 ,并将它们存储在读入缓冲由s指向。读数在 和EOF或换行符后停止。如果读取换行符,则将其存储到 缓冲区中。 终止空字节('\ 0')存储在缓冲区中最后一个 字符之后。


从HP-UX 11手册页逐字(由我斜体):

与fgets()

从流进阵列读取字符指出 由s,直到读取n-1个字符,则会读取新行 字符并将其传输到s,否则将遇到文件条件末尾。 然后字符串 以空字符结尾。


POSIX specs

的与fgets()函数将读取流的字节到阵列指向S,直到n-1个字节被读入,或一个被读并转移到s,或者遇到文件结束条件。 然后字符串以空字节终止。


最后未至少from MSDN

的与fgets函数从在STR输入流参数,并将其存储的字符串。 fgets从当前流位置读取字符并包括第一个换行符,并将其包含到流结尾,或者直到读取的字符数等于n - 1,以先到者为准。存储在str中的结果会附加一个空字符。换行符包含在字符串中。

+0

除了Linux以外,还有其他的东西你知道...... – Virus721

+0

@ Virus721好吧,如果不确定回落到C标准,如* user694733 *所示,答案也可能有帮助。 – alk