函数 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
函数只是读取一些元素,它没有“字符串”的概念。
fgets
/ fscanf
我个人会选择fgets
。
【讨论】:
对于那些感兴趣的人,这里给出了一个从 fgets 中删除换行符的示例实现:***.com/questions/2693776/…【参考方案2】:man page for fread 没有说明在文件末尾添加终止零。
如果您想安全起见,请将您的 c 数组中的所有字节初始化为零(通过 bzero 或类似的方式),当您读入时,您将获得一个终止的 null。
我已经链接了fread
和bzero
的两个手册页,希望对您有所帮助。
【讨论】:
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函数,当文件流缓冲中剩余长度小于需要读取的长度时的问题