如何使用C++逐字节写入文件

10

如何使用c++逐字节写入文件?

unsigned short array[2]={ox20ac,0x20bc};

如果我有一个十六进制值0x20ac,我如何在C++中将其逐字节写入文件?


你不想一次性把它写完吗? - Marcelo Cantos
1
out.write(reinterpret_cast<char const*>(array), sizeof array) 可以让你写出底层的字节表示。 - Simple
1
@Simple,这需要知道字节序吗? - leewz
1
@leewangzhong 取决于大小端是否是一个问题。 - Simple
1
作为StackOverflow上一个非神秘问题的答案,我认为我们应该尽可能完整地回答所问的问题,因此我们应该包含相关细节,以便那些找到这个问题的人能够理解。 - leewz
4个回答

10
你可以尝试像这样做:

你可以尝试这样的操作:

#include <fstream>
...

ofstream fout;
fout.open("file.bin", ios::binary | ios::out);

int a[4] = {100023, 23, 42, 13};
fout.write((char*) &a, sizeof(a));

fout.close();

1
如果意图是逐字节而不是每次4个字节地写入,您将希望使用char或unsigned char而不是int。 - mreff555
当您使用std::ofstream时,ios::out说明符是多余的。 - Antonio

6

一种方法是使用标准C++库:

#include <fstream>
#include <assert.h>

void main()
{
    unsigned short array[2]={ox20ac,0x20bc};

    std::ofstream file;
    file.open("C:/1.dat", std::ios_base::binary);
    assert(file.is_open());

    for(int i = 0; i < sizeof(array) / sizeof(array[0]); ++i)
       file.write((char*)(array + i * sizeof(array[0])), sizeof(array[0]));
    file.close();
}

另外,您也可以轻松地一次性写入所有数据(无需循环):

file.write((const char*)array, sizeof(array));

这行代码将整个数组写入文件中。请注意,它假定数组的大小与文件的大小相同,并且不进行任何错误检查。

这将会写入相同的字节两次。 - interjay
现在你的第一段代码将会写入数组中包含的四个字节中的两个(每个元素的第一个字节)。而且这个一行代码应该只有 sizeof(array),不需要除以 sizeof(array[0]) - interjay
我无法打开输出文件。 - Venkatesan
@Venkatesan:你的意思是我的断言失败了吗?你用的是Windows系统吗? - Violet Giraffe
如果我在数组中提供一个字节的十六进制值,比如0x0056,它可以正常工作。但如果是0x20ac,我就无法打开文件。 - Venkatesan
显示剩余4条评论

0

要打开一个输出文件,请使用ofstream(输出文件流,ostream的子类)。如果您不确定您的输出是否为可读文本(ASCII),请使用ios_base :: binary模式(作为构造函数或open()成员函数的第二个参数)。

要写入单个字节,请使用ostream成员函数“put”。要一次写入多个字节,请使用ostream成员函数“write”。

有一些方法可以将数据类型(例如int)长于一个字节并将它们用作字节数组。这有时被称为类型转换,并在其他答案中进行了描述,但请注意字节顺序和数据类型的不同大小(int可以是2-8个字节),这在不同的机器和编译器上可能会有所不同。

要测试您的输出,请将其重新打开为输入文件并打印字节。

ifstream in("myfile.txt", ios_base::binary);
while(!in.eof()) printf("%02X ", in.get()); //print next byte as a zero-padded width-2 capitalized hexadecimal).
in.close();

或者像普通人一样使用十六进制编辑器。


-5

你可以使用write函数或ostream。 在C++中使用的函数是ostream。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接