2

我正在尝试阅读 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);

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

4

2 回答 2

1

您需要为 15 个字符的文本提供缓冲区空间,最多为新行提供 2 个字符(以处理 Windows 行终止\r\n),以及为空终止提供更多字符。所以是18。

就像你在这里做的那样:

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

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

于 2012-11-17T14:25:54.920 回答
1

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

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

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

于 2012-11-17T14:32:02.613 回答