【发布时间】:2015-04-17 23:02:18
【问题描述】:
C 中的fwrite() 函数使用const void *restrict buffer 作为第一个参数,因此您可以直接将指向struct 的指针作为第一个参数传递。
http://en.cppreference.com/w/c/io/fwrite
例如fwrite(&someStruct, sizeof(someStruct), 1, file);
但在 C++ 中,ostream::write() 需要 const char_type*,这迫使您使用 reinterpret_cast。 (在 Visual Studio 2013 中,它是 const char*。)
http://en.cppreference.com/w/cpp/io/basic_ostream/write
例如file.write(reinterpret_cast<char*>(&someStruct), sizeof(someStruct));
几乎在所有情况下,要写入文件的二进制数据都不是char 数组,那么为什么标准更喜欢看起来更复杂的样式呢?
附言
1、其实我在ofstream和ios::binary模式下使用了write()方法,但是根据参考,它继承了ofstream。所以我在上面使用ostream::write()。
2. 如果要打印字符流,可以使用operator<<()。
write() 方法不是专为写入原始数据设计的吗?
3.如果write()不是写入二进制数据的方式,那么标准内的方式是什么? (尽管由于不同平台上的各种内存对齐策略,这可能会影响代码的可移植性)
【问题讨论】:
-
因为这使得强制转换显式,并要求程序员考虑一下将他的(二进制)结构转换为字符序列会如何影响可移植性? (这是我的猜测,因此是评论而不是答案。)
-
你在问为什么一个字符流表现得像一个字符流?因为它是一个字符流,所以无论您是否想(ab)通过将其他类型的原始字节写入其中来使用它。
-
您可以写入文件的任何内容是
char数组。 -
@DevSolar 问题是如果你有一个
unsigned char数组——一种用于保存二进制数据的类型,你不能在没有reinterpret_cast 的情况下将它写入fstream。而 clang-tidy 和其他 linters 会为此咬牙切齿。
标签: c++ file fwrite void ofstream