3

fwrite 是可移植的吗?我并没有真正面临下面描述的问题,但我想了解 C 的基础知识。

以免假设我们有两台机器 A8(字节 = 8 位)和 B16(字节 = 16 位)。

下面的代码会在两台机器上产生相同的输出吗?

unsigned char[10] chars;
...
fwrite(chars,sizeof(unsigned char),10,mystream);

我猜 A8 将产生 80 位(10 个八位字节),而 B16 将产生 160 位(20 个八位字节)。我错了吗?

如果仅使用 uintN_t 类型,则不会出现此问题,因为它们的位长度与字节大小无关。但也许 uint8_t 不会在 B16 上存在。

这个问题的解决方案是什么?

我想构建一个 uint32_t 数组,将我的字节放入这个数组中(根据机器的架构使用智能移位和掩码)并编写这个数组将解决问题。但这并不令人满意。再次假设 uint32_t 存在于所有平台上。这个数组的填充将非常依赖于当前机器的架构。

感谢您的任何回复。

4

3 回答 3

2

fwrite() 是一个标准库函数。所以它必须对每个 C 编译器都是可移植的。也就是说,它必须在该编译器的 C 标准库中定义以支持您的机器。

所以8位、16位、32位的机器给你同样的高级操作。

但是如果你想设计那些库函数,那么你必须考虑机器架构,该机器的内存组织。

作为 C 编译器用户,您不应该为内部行为而烦恼。

我想你只是想使用那些 C 库函数。因此,不同机器的功能行为没有差异。

于 2012-07-27T10:38:11.293 回答
0

在 C 中,char 被定义为“机器的最小可寻址单元”。也就是说,char 不一定是 8 位。

在大多数情况下,依靠 char 是 8 位这一事实是足够安全的,而不是处理一些极端情况。

一般来说,您可能无法将“半字节”写入存储中的文件。此外,设计用于不同字节大小机器的设备之间的硬件级别的可移植性也会存在问题。如果您正在处理其他设备(例如电信或其他设备),则必须实现比特流。

于 2012-07-27T10:09:00.670 回答
0

A byte is on almost every modern computer 8 bits. But there is an other reason fwrite isn't portable:
A file which was written on a Little Endian machine can't be readed by a big endian machine and other way.

于 2012-07-27T09:53:40.297 回答