函数 fgetc 在流中读取多少位?
fgetc 的手册页告诉这个函数读取一个“字符”,但一个字符对我来说不是一个明确的定义。多少位包含一个“字符”?使用 fgetc 读取字符是否等同于读取字节?
它是否取决于机器的架构以及“char”或“byte”的大小?
我的目标是读取具有可移植性的流中的二进制数据(字节 = 8 位或字节 = 16 位)。将 fread/fwrite 与 uintN_t 之类的类型一起使用而不是 fgetc 来控制在流中读取多少位是一个更好的主意吗?有更好的解决方案吗?
函数 fgetc 在流中读取多少位?
fgetc 的手册页告诉这个函数读取一个“字符”,但一个字符对我来说不是一个明确的定义。多少位包含一个“字符”?使用 fgetc 读取字符是否等同于读取字节?
它是否取决于机器的架构以及“char”或“byte”的大小?
我的目标是读取具有可移植性的流中的二进制数据(字节 = 8 位或字节 = 16 位)。将 fread/fwrite 与 uintN_t 之类的类型一起使用而不是 fgetc 来控制在流中读取多少位是一个更好的主意吗?有更好的解决方案吗?
多少位包含一个“字符”?
一个字符包含精确CHAR_BIT的位,一个特定于实现的值,定义在limits.h.
/* Number of bits in a `char'. */
# define CHAR_BIT 8
使用 fgetc 读取一个字符相当于读取一个字节
是的,fgetc只读取一个字节。
这个可移植性问题不容易解决。最好的解决方法是不对二进制表示进行假设。
fgetc正好读一个字节。字符类型(signed char、char和unsigned char限定版本)包含CHAR_BIT位 ( <limits.h>),它是大于 的常数8。
您的平台有一个最小的数据单元,它对应于 C 数据类型char。所有 I/O 都以 s 为单位发生char。您可以保证 char 可以保存 0–127 和 0–255 或 -127–127 的值。其他一切都是特定于平台的。(a 中的实际位数char包含在宏中CHAR_BIT。)
也就是说,只要您只在每个字符中写入和读取广告范围内的值,就可以保证您的程序可以在任何符合标准的平台上运行。唯一不能保证的是生成的数据流将是二进制相同的。