2010-12-12 91 views
0

当我尝试使用C编写文件时; fwrite它接受void类型作为数据,它不被文本编辑器解释。使用c和C++写入文件

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++;在二进制模式下流write,它是可读的。为什么它不会像使用fwrite写的一样?

+1

听起来像你使用'fwrite'不正确。你可以发布一些代码吗? – 2010-12-12 05:00:17

+0

我发布了'fwrite'。 – user963241 2010-12-12 05:07:57

+0

你的'流'是什么? – chrisaycock 2010-12-12 05:13:00

回答

0

这是在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); 
} 

这应以相同的方式将对象保存为fwrite会。如果它不适合你,请用流发布你的代码 - 我们会看看有什么不对。

+0

@Kos我试图超载f << c,插入一个然后b。 – user963241 2010-12-12 07:02:18

+0

哦,这就解释了为什么你收到了文本输出。如果你想要原始的二进制输出,你现在知道该怎么做。 – Kos 2010-12-12 07:16:37

+0

我以原始二进制模式使用C和C++文件流编写了两个文件,但是如何使用C编写的文件比使用C++编写的文件大90%? – user963241 2010-12-12 07:28:37

0

C++的ofstream流插入只能进行文本操作。在二进制文本模式下打开一个iostream的区别是天气或不行结束字符转换发生。如果你想编写一个二进制格式,其中一个32位int需要正好32位使用C++中的c函数。

编辑为什么fwrite的可能是更好的选择:

的ostream的写入方法是或多或少的fwrite的克隆(除了它是有点不太有用,因为它仅需要一个字节数组和长度代替的fwrite的4的params),但通过坚持使用fwrite,无法在一个地方意外地使用流式插入并在另一个地方写入。更少的是它是一种安全机制。当你获得这种安全边际时,你会失去一点灵活性,但你不能再制作一个iostream衍生产品来压缩输出,而不用改变任何文件编写代码。

+0

Untrue,C++流对象也完全适用于二进制数据...喜欢它们超过C选项的一个原因是安全连接到在对象的析构函数中关闭文件。 – Kos 2010-12-12 06:40:45

+0

@Kos功能正确但fwrite提供了更好的界面。 – stonemetal 2010-12-12 12:56:58