C 语言中的 Fread 读数超过指示值

fread in c reads more than instructed

提问人:Michael 提问时间:6/25/2018 最后编辑:StoogyMichael 更新时间:5/3/2020 访问量:1152

问:

我正在尝试编写一个程序,该程序将向 .wav 文件添加效果。

该计划应:

  1. 读取 .wav 文件

    • 解析标头
    • 读取数据
  2. 操作数据

  3. 创建一个新的 .wav 文件 -
    • 编写标题
    • 写入新数据

我被困在一些奇怪的功能上 - 当我尝试将 4 个字节读取到我定义的 char 数组(大小为 4 字节)时 - 我得到单词 + 垃圾。fread()

如果我尝试以相同的方式读取 2 或 3 个字节 - 一切正常。

在这两种情况下,我都尝试打印数组的内容(当我读取 2/3 字节时,当我读取 4 字节时)使用 while 循环直到“\n”而不是 printf(“%s”) - 我得到了相同的结果(在第一种情况下写字符串,在第二种情况下写字符串 + 垃圾)。 另外,我写回标题并复制数据 - 创建的文件不是同一首歌! 它确实打开了 - 所以标头很好,但数据是垃圾。 我很高兴听到一些可能的原因。我真的被困住了,请帮帮我!问题 - 输出的打印屏幕

C 面包

评论

3赞 Cyclonecode 6/25/2018
这是因为您需要为终止 null 字符分配空间。c 字符串总是以 null 字符结尾,即 .因此,缓冲区需要有 5 个字符的空间。\0
3赞 Some programmer dude 6/25/2018
即使你没有活跃,你仍然已经成为会员三年多了,这应该有足够的时间阅读帮助页面,特别是“我可以在这里问什么主题?”和“我应该避免问什么类型的问题?”。另请阅读如何提出好问题,并学习如何创建最小、完整和可验证的示例
1赞 Some programmer dude 6/25/2018
我还推荐这个问题清单,并且您阅读所有 idownvotedbecau.se 以了解您的问题可能获得反对票的一些原因。
2赞 Some programmer dude 6/25/2018
请记住,文件是二进制文件,它们不包含文本数据,因此您不能真正使用文本函数来打印数据。.wav
0赞 qrdl 6/25/2018
不要描述你的代码 - 展示你的代码

答:

1赞 jspcal 6/25/2018 #1

也许为您的 .这将允许您将 4 个字符的字符串表示为以 null 结尾的 C 字符串。读取最后一个字符后的字节应设置为空字符 ()。fmt_chunk_marker'\0'

5赞 Shloim 6/25/2018 #2

fread不用于读取字符串。它读取二进制数据。这意味着数据不会被 null 终止,也不会有任何其他终止。

fread返回读取字节数。在此之后,数据将不会初始化,必须忽略。

如果要将数据视为字符串,则必须使用 null 自行终止它。确保其容量最小,以避免缓冲区溢出。arr[count]=0arrcount+1