0

函数 fgetc 在流中读取多少位?

fgetc 的手册页告诉这个函数读取一个“字符”,但一个字符对我来说不是一个明确的定义。多少位包含一个“字符”?使用 fgetc 读取字符是否等同于读取字节?

它是否取决于机器的架构以及“char”或“byte”的大小?

我的目标是读取具有可移植性的流中的二进制数据(字节 = 8 位或字节 = 16 位)。将 fread/fwrite 与 uintN_t 之类的类型一起使用而不是 fgetc 来控制在流中读取多少位是一个更好的主意吗?有更好的解决方案吗?

4

3 回答 3

2

多少位包含一个“字符”?

一个字符包含精确CHAR_BIT的位,一个特定于实现的值,定义在limits.h.

/* Number of bits in a `char'.  */
#  define CHAR_BIT      8

使用 fgetc 读取一个字符相当于读取一个字节

是的,fgetc只读取一个字节。

这个可移植性问题不容易解决。最好的解决方法是不对二进制表示进行假设。

于 2012-07-27T13:26:40.323 回答
1

fgetc正好读一个字节。字符类型(signed charcharunsigned char限定版本)包含CHAR_BIT位 ( <limits.h>),它是大于 的常数8

于 2012-07-27T13:51:29.393 回答
0

您的平台有一个最小的数据单元,它对应于 C 数据类型char。所有 I/O 都以 s 为单位发生char。您可以保证 char 可以保存 0–127 和 0–255 或 -127–127 的值。其他一切都是特定于平台的。(a 中的实际位数char包含在宏中CHAR_BIT。)

也就是说,只要您只在每个字符中写入和读取广告范围内的值,就可以保证您的程序可以在任何符合标准的平台上运行。唯一不能保证的是生成的数据流将是二进制相同的。

于 2012-07-27T13:28:20.207 回答