C++ 使用c和c+写入文件+;

C++ 使用c和c+写入文件+;,c++,c,C++,C,当我尝试用C编写文件时fwrite接受void类型作为数据,文本编辑器不会对其进行解释 struct index { index(int _x, int _y):x(_x), y(_y){} int x, y; } index i(4, 7); FILE *stream; fopen_s(&stream, "C:\\File.txt", "wb"); fwrite(&i, sizeof(index), 1, stream); 但我尝试C++时;对于二进制模式下的

当我尝试用C编写文件时
fwrite
接受
void
类型作为数据,文本编辑器不会对其进行解释

struct index
{
   index(int _x, int _y):x(_x), y(_y){}
   int x, y;
}

index i(4, 7);

FILE *stream;
fopen_s(&stream, "C:\\File.txt", "wb");
fwrite(&i, sizeof(index), 1, stream);

但我尝试C++时;对于二进制模式下的流

写入
,它是可读的。为什么它和用
fwrite
编写的不一样?

C++的流插入只对文本起作用。以二进制模式打开iostream与以文本模式打开iostream的区别在于是否发生了行尾字符转换。如果你想写二进制格式,其中一个32位int正好32位,使用C++中的C函数。 编辑为什么fwrite可能是更好的选择:


Ostream的write方法或多或少是fwrite的一个克隆(除了它不太有用,因为它只需要一个字节数组和长度,而不是fwrite的4个参数),但是通过坚持fwrite,无法在一个地方意外地使用流插入,而在另一个地方写入。更何况它是一种安全机制。虽然您获得了安全边际,但您失去了一点灵活性,您不能再制作一个iostream派生,它可以在不更改任何文件写入代码的情况下压缩输出。

这是在C++中使用流写入二进制数据的方法:

struct C {
    int a, b;
} c;

#include <fstream>
int main() {

    std::ofstream f("foo.txt",std::ios::binary);
    f.write((const char*)&c, sizeof c);
}
struct C{
INTA,b;
}c;
#包括
int main(){
流f的std::of(“foo.txt”,std::ios::binary);
f、 写入((常量字符*)&c,大小为c);
}

这将以与写入相同的方式保存对象。如果不适合您,请用streams发布您的代码-我们会看看有什么问题。

听起来您使用的
fwrite
不正确。你能发布一些代码吗?你的C++代码怎么样?OffStand你做什么?不真实,C++流对象完全适合二进制数据…选择它们而不是C替代方案的一个原因是,在对象的析构函数中关闭文件是安全的。@Kos-capable-true,但fwrite提供了更好的接口。哦,这解释了为什么您会收到文本输出。如果你想要原始二进制输出,你知道现在该怎么做。我用C和C++文件流在原始二进制模式下写了两个文件,但是为什么用C写的文件比我用C++写的文件大90%?检查我提交的流示例,它应该精确地写8字节到文件。的确是这样。