1

我只是想知道,当您仅使用诸如 textedit (在 OSX 上)之类的普通应用程序输入文本时,它是否仍会在每个字符串的末尾包含相同的 '\0' 字符,以便在通读时fgets()if 会选择所述字符并停止阅读?

因为我创建了一个普通的文本文件,但fgets()在指定长度的末尾继续停止,而不是在它找到该字符时停止,所以当我写入普通文本文件时,我怀疑它是否真的存在。

例如:

How Are You
There

fgets(str, 15, 标准输入); 这最终会产生:TherAre You

4

3 回答 3

3

不,通常,文本文件不包含\0字符。 fgets读取请求的字符数,或到行尾,以先到者为准。它fgets本身附加了\0. 从手册页

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

于 2012-09-13T06:28:25.273 回答
0

不,文本文件通常不包含任何控制字符。终止符是 C 的“特性”,即 C 语言和环境如何处理字符串的属性。文本文件与 C 无关。终止由函数添加(到已读取数据的内存缓冲区)fgets()

于 2012-09-13T06:29:07.167 回答
0

如果您的输入文件确实包含一个空字节并且您正在使用fgets()或等效读取,那么您很难知道字符串中间的空值是否只是“文本”文件中的空值,或者表示文件的最后一行没有以换行符结尾,或者该行被截断。显然,如果您尝试再次读取并获取更多数据,这并不是一个过早的 EOF。如果紧接在空字节之前的字符是换行符,那么您可以假设空字节是由 . 添加的字符串标记的结尾fgets()

因此,一般来说,如果文件包含空字节,则使用它fgets()来读取文件不是一个好主意。

于 2012-09-13T06:38:20.503 回答