fgets()/getline() 常用于阅读文本。
不常见的是,输入流包含一个空字符 '\0'。
fgets() 像任何字符一样读取 空字符。它不会停止读取输入的行。
以下内容仅打印到 string 中遇到的第一个 null 字符 - 它与读取的 null 字符 和附加的字符没有区别fgets() 添加的空字符。
while (fgets(buffer, sizeof(buffer), fptr)) {
printf("%s", buffer); // Maybe stops too early?
}
getline(),虽然是非标准的 C,但有一个优势,因为它返回读取的字符数。然后打印可以打印到返回的计数,而不仅仅是第一个空字符。
size_t n = 0;
char *buffer = NULL;
ssize_t sz;
while ((sz = getline (&buffer, &n, fptr)) != -1) {
fwrite(buffer, 1, sz, stdout);
}
free(buffer);
注意:size_t n = 0; char *buffer = NULL; 是初始设置。 getline (&buffer, &n, ...) 接收这两个变量的地址,允许它根据需要更新这两个变量(由于重新分配)。最大缓冲区大小为SIZE_MAX 或内存池的限制。我们不需要知道它在 getline() 中是如何工作的,因为这是一个不同的实现细节。
虽然空字符在简单的文本文件中并不常见,但我发现编写代码最好be prepared 处理空字符。他们很容易想到读取一个UTF16 编码的文本文件。当然,期待 ASCII 或 UTF8 文本文件并获得 UTF16 文件是一个问题,很好地打印思想 null 字符 有助于识别问题。