函数fread没有以\0终止字符串

15

作为C语言新手,尝试通过fread读取文件。

这是文件的内容:

line1 how

使用的代码:

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

输出变量 'c' 时,内容末尾会出现一个随机字符(例如:line1*)

fread() 函数没有终止字符串或者我漏掉了什么吗?


3
fread 只能读取字节到缓冲区中,它并不知道你所谓的字符串是什么。 - Dan D.
3个回答

16

不可以。fread函数只是简单地读取一定数量的元素,它没有字符串的概念。

  • 你可以自己添加NUL终止符
  • 你也可以使用fgets/fscanf

个人建议使用fgets


对于那些感兴趣的人,这里提供一个从fgets中删除换行符的示例实现:https://dev59.com/M3E85IYBdhLWcg3wnU0d - m-ric

4

对不起,我来晚了。

不,fread不会为您处理这个。必须手动完成。 幸运的是,这并不难。 我喜欢使用fread()的返回值来设置NUL,就像这样:

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

现在,您已经拥有了一个以\0结尾的字符串。更妙的是,我们还有一个非常方便的变量x,如果以后需要使用strlen()函数,它可以省去我们的麻烦。太棒了!


1

fread 的手册没有提到在文件结尾添加结束符零。

如果你想要安全,可以通过 bzero 或类似函数来将 c 数组中所有字节初始化为零,当你读入后,就有了一个终止的空值。

我已经链接了 freadbzero 的两个手册,希望能帮助到你。


bzero()已经被弃用(并且已从POSIX.1-2008中删除),建议使用memset() - alx - recommends codidact

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接