如何让 fgets 不会停止阅读 \n?

How to let fgets not stop reading at \n?

提问人:Marlon Müller 提问时间:11/13/2023 最后编辑:chux - Reinstate MonicaMarlon Müller 更新时间:11/14/2023 访问量:98

问:

我想从文件中读取固定长度的 s。因此,我使用 ,但停止阅读。charfgetsfgets"\n"

我怎样才能读出第一个 N,即使其中一个是换行符?char

我尝试在文档中搜索其他功能,但没有找到。

C fgets

评论

9赞 CGi03 11/13/2023
具有 Fread 功能。

答:

4赞 chqrlie 11/13/2023 #1

要从流中读取固定数量的字节,您应该使用:fread

#include <stdio.h>

size_t fread(void * restrict ptr, size_t size, size_t nmemb,
             FILE * restrict stream);

fread尝试读取每个字节的元素,并返回成功读取的元素数。它在文件末尾返回。nmembsize0

此外,请确保文件以二进制形式打开,以防止在旧系统上转换可能干扰字节计数的行结束序列。"rb"

评论

1赞 chux - Reinstate Monica 11/13/2023
此外,流应以二进制模式打开,以免转换行尾等。
1赞 gulpr 11/13/2023 #2

要确保字符串以 null 字符结尾,您需要编写自己的函数

char *freads(char *buff, size_t len, FILE *fi)
{
    size_t readBytes = fread(buff, 1, len - 1, fi);

    if(!readBytes) return NULL;
    buff[readBytes] = 0;
    return buff;
}

评论

0赞 Sir Jo Black 11/16/2023
我建议在所有情况下都以零终止,即使没有读取任何内容并且返回 null!
0赞 gulpr 11/16/2023
@SirJoBlack 否,如果返回 NULL,则代码不会到达那里。
0赞 Sir Jo Black 11/16/2023
如果设置缓冲区,则可以避免最终使用不正确的数据,并获得在两种情况下缓冲区将为空,另一方面,很明显,测试函数返回的 NULL 值,调用方应该知道缓冲区无效,因为读取文件中没有更多数据。反正你说的没问题!