函数 fread 不以 \0 终止字符串

Posted

技术标签:

【中文标题】函数 fread 不以 \\0 终止字符串【英文标题】:Function fread not terminating string by \0函数 fread 不以 \0 终止字符串 【发布时间】:2012-02-10 18:21:43 【问题描述】:

C 中的文件新手,尝试通过 fread 读取文件

这是文件的内容:

line1 how

使用的代码:

char c[6];
fread(c,1,5,f1)

输出 var 'c' 时,内容以随机字符结尾出现(如:line1*)

fread 不会终止字符串还是我遗漏了什么?

【问题讨论】:

fread 只将字节读入缓冲区。它对你所说的字符串一无所知。 【参考方案1】:

没有。 fread 函数只是读取一些元素,它没有“字符串”的概念。

您可以自己添加 NUL 终止符 您可以改用fgets / fscanf

我个人会选择fgets

【讨论】:

对于那些感兴趣的人,这里给出了一个从 fgets 中删除换行符的示例实现:***.com/questions/2693776/…【参考方案2】:

man page for fread 没有说明在文件末尾添加终止零。

如果您想安全起见,请将您的 c 数组中的所有字节初始化为零(通过 bzero 或类似的方式),当您读入时,您将获得一个终止的 null。

我已经链接了freadbzero 的两个手册页,希望对您有所帮助。

【讨论】:

bzero() 已被弃用(并已从 POSIX.1-2008 中删除),取而代之的是 memset()【参考方案3】:

抱歉我来晚了。

不,fread 不会为您处理这个问题。必须手动完成。 幸运的是它并不难。 我喜欢使用 fread() 的 return 来设置 NUL,如下所示:

char buffer[16+1]; /*leaving room for '\0' */
x = fread(buffer, sizeof(char), 16, stream);
buffer[x]='\0';

现在你有一个以 \0 结尾的字符串,作为奖励,我们有一个漂亮的变量 x,如果我们以后需要它,它实际上为我们省去了运行 strlen() 的麻烦。整洁!

【讨论】:

以上是关于函数 fread 不以 \0 终止字符串的主要内容,如果未能解决你的问题,请参考以下文章

C语言中fread函数,当文件流缓冲中剩余长度小于需要读取的长度时的问题

C语言中如何使用fread

如何使用fread函数循环读取二进制文件

php fread()函数读取文本直到文件尾却无法结束

对 STL 字符串使用 fread/fwrite。这是正确的吗?

fread - 跳过以特定字符开头的行 - “#”