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



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

起初,我尝试了这个:

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

它在没有换行符的情况下正确地读取了行,我假设buf[15]包含null字符。

然而,当我想读取和存储换行符时,它并没有像我想象的那样工作。据我所知,'\n'应该被视为一个字符,只需要一个字节,所以要读取它,我只需要再读取一个字符。

但当我尝试这个时

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

它做的事情与前面的例子完全相同——现在我的字符串中存储了换行符(在这种情况下,我不确定null字符存储在哪里)

要用换行符读取整行,我需要做这个

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

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

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

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

您需要为15个字符的文本提供缓冲区空间,新行最多2个字符(用于处理rn的Windows行终止),空终止最多一个字符。所以这是18。

就像你在这里做的那样:

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

fgetsnum参数告诉调用要写入的缓冲区的大小

我正在尝试读取1行,但我不确定换行符是如何表示的。

在文本模式下,换行符是'\n',这在任何符合C的实现中都是正确的,除了文本模式流之外,我不会在任何东西上使用fgets(我不知道——我也不想知道——在二进制模式下,它是如何在使用\r作为行尾标记的实现中工作的,或者更糟的是,使用带外行尾标记,我不会感到惊讶,它会查找一个,因此永远找不到一个,直到文件结束才尝试读取)。

您应该为最大的行长度分配空间,包括换行符和终止NUL,更重要的是,您决不能在缓冲区的长度上撒谎。您可以检查缓冲区是否足够长,因为如果没有,换行符就不会出现。

问题是关于允许您测试换行符的espace序列,它是两个字符\0x0d\0x0a,但当使用strcmp并需要为此提供字符串和长度时,C转义码只包含一个字符,因此您必须:

if(strncmp(&buff[i], "n", 1) == 0)

这在长度为2的情况下是不起作用的。不要问我为什么。

最新更新