C - fgets() - 换行符的长度

时间:2012-11-17 14:18:11

标签: c char newline fgets

我正在尝试阅读1行,我不确定如何表示换行符。当我用fgets()从文件中读取它时,我应该将其视为2个字符还是1个字符?例如,我在文件中有一行15个字符+新行。那么我应该如何安全地分配字符串并读取该行?

起初,我试过这个:

char buf[16];
fgets(buf, 16, f);

它在没有换行符的情况下正确读取了行,我认为buf [15]包含空字符。

但是,当我想阅读并存储换行符时,它并不像我想的那样工作。据我所知,'\ n'应该被视为一个字符,只需要一个字节,所以要阅读它,我只需要再读一个字符。

但是当我尝试这个时

char buf[17];
fgets(buf, 17, f);

它与前面的例子完全相同 - 现在我的字符串中存储了换行符(我不确定在这种情况下存储null char的位置)

要使用换行读取整行,我需要这样做

char buf[18];
fgets(buf, 18, f);

或者这个(它有效,但我不确定它是否安全)

char buf[17];
fgets(buf, 18, f);

所以问题是,为什么我需要分配和读取18个字符,当该行只有15个字符+换行符时?

2 个答案:

答案 0 :(得分:1)

您需要为15个字符的文本提供缓冲区空间,为新行提供最多2个字符(以处理\r\n的Windows行终止),还有一个用于空终止。那是18岁。

就像你在这里所做的那样:

char buf[18]; fgets(buf, 18, f);

num fgets参数告诉调用它写入的缓冲区的大小。

答案 1 :(得分:1)

  

我正在尝试阅读1行,我不确定如何表示换行符。

在文本模式下,换行是'\ n',并且在任何符合C的实现上都是如此我不会在文本模式流上使用fgets(我不知道 - 我不想知道 - 如果在使用\ r作为行尾标记的实现上以二进制模式工作,或者更糟糕的是使用带外行结束标记,我不会感到惊讶它寻找\ n并且永远不会找到一个尝试阅读直到文件结束。)

您应该为最大行长度分配空间,包括换行符和终止NUL,更重要的是,您必须永远不要假设有关缓冲区长度的fgets。您可以检查缓冲区是否足够长,因为如果不存在换行符,则不会出现。