【发布时间】:2020-12-01 22:13:54
【问题描述】:
我有一个任务,基本上我想使用getchar() 从音频文件中读取所有字节,如下所示:
while(ch = getchar()) != EOF)
在某些时候,我必须读取代表 文件大小 的 4 个连续字节,但我无法理解以下内容:
例如,如果我的程序正在读取的文件大小为 150 字节,则足以存储在 4 个字节中的 1 个字节中,这意味着在这种情况下,3 个字节将为 0,最后一个字节将为 150。我知道我需要通过上述 cod 部分中的 4 次 while 重复来读取所有 4 个字节,以获得我需要的所有信息,但是 getchar() 究竟是什么将返回到我的变量,因为它返回它刚刚读取的字符的 ASCII 码?
此外,对于无法存储在单个字节中的较大数字会发生什么?
【问题讨论】:
-
如果文件中的某个数据字段包含四个字节,则需要读取所有四个字节才能获取所有数据。即使这四个字节的组合值可以放入更小的类型,文件中的数据仍然是四个字节。此外,除非您实际读取所有四个字节并以合适的方式组合它们,否则您甚至都不知道该值。
-
在使用基于字符的函数读取任意字节时也要小心。首先要记住
getchar返回一个int。然后记住char类型的“字符”可以是signed或unsigned,一般来说,在处理原始字节(而不是实际字符)时,您需要显式使用无符号类型(即unsigned char,或者更好的是uint8_t)。 -
请花点时间阅读the help pages,阅读SO tour,阅读How to Ask,以及this question checklist。如前所述,请了解如何edit您的问题。
-
您是否涵盖了诸如数组之类的内容和/或诸如
char和int等变量类型的位的确切组成部分?字节序如何?因为用getchar()读取4 个值并在所有情况下获得正确的组合值实际上很难正确完成。它还取决于数据是如何写入文件的 - 您的老师必须提供该信息以确保您获得正确的结果。 -
同样,ASCII 是编码 文本 的标准。二进制文件不是文本。 ASCII 不相关。对于一个 1 MB 的文件,试着写出一个代表这个大小的 4 字节整数的样子。它将包含哪些字节值?你能从它的单个字节值重构整数,将其视为小整数吗?