我正在尝试阅读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个字符+换行符时?
答案 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。您可以检查缓冲区是否足够长,因为如果不存在换行符,则不会出现。