C++ 如何在C++;?

C++ 如何在C++;?,c++,binaryfiles,C++,Binaryfiles,我尝试将char[]写入二进制文件,这是我的方法,用于int、float、double和char* friend ofstream& operator<<(ofstream& outB, Test& t) { //scriem int, float si double normal outB.write((char*)&t.i, sizeof(int)); outB.write((char*)&t

我尝试将char[]写入二进制文件,这是我的方法,用于int、float、double和char*

friend ofstream& operator<<(ofstream& outB, Test& t) {
        //scriem int, float si double normal
        outB.write((char*)&t.i, sizeof(int));
        outB.write((char*)&t.f, sizeof(float));
        outB.write((char*)&t.d, sizeof(double));
        //scriem stringul ca un char ( +1 pentru \0)
        outB.write(t.s.c_str(), t.s.size() + 1);
        //scriem charul
        int nrCHAR = strlen(t.c) + 1;
        outB.write((char*)&nrCHAR, sizeof(int));
        outB.write(t.c, strlen(t.c) + 1);
        return outB;
}

c作为我的字符[]

通常,文本字段的长度是可变的,因此您必须写入长度和文本。以下是我的建议:

const uint32_t length = strlen(c);
outB.write((char *) &length, sizeof(length));
outB.write(c, length);
阅读时,您可以执行相反的操作:

const uint32_t length = 0;
inpB.read((char *) &length, sizeof(length));
char * text = new char [length + 1];
inpB.read(&text[0], length);
text[length] = '\0';
首先写入长度的一个很好的特性是,您可以在读取文本之前为字符串分配动态内存。此外,由于文本的长度是已知的,因此可以执行块读取


使用sentinel字符时,如
“\0”
,必须逐个字符读取,直到sentinel被读取为止。这很慢,真的很慢。您可能还需要重新分配数组,因为您不知道字符串的大小。

通常,文本字段的长度是可变的,因此您必须写入长度和文本。以下是我的建议:

const uint32_t length = strlen(c);
outB.write((char *) &length, sizeof(length));
outB.write(c, length);
阅读时,您可以执行相反的操作:

const uint32_t length = 0;
inpB.read((char *) &length, sizeof(length));
char * text = new char [length + 1];
inpB.read(&text[0], length);
text[length] = '\0';
首先写入长度的一个很好的特性是,您可以在读取文本之前为字符串分配动态内存。此外,由于文本的长度是已知的,因此可以执行块读取


使用sentinel字符时,如
“\0”
,必须逐个字符读取,直到sentinel被读取为止。这很慢,真的很慢。您可能还需要重新分配数组,因为您不知道字符串的大小。

请注意问题中使用的
uint32\t
。这是一个固定宽度的整数。这解决了大多数整数类型没有固定大小的恼人问题。一台计算机可以有一个16位
int
和另一个64位
uint32\u t
确保读写器都同意长度大小,否则无法编译。这无助于解决的恼人问题,但这本身就是一个问题。请注意问题中使用的
uint32\u t
。这是一个固定宽度的整数。这解决了大多数整数类型没有固定大小的恼人问题。一台计算机可以有一个16位
int
和另一个64位
uint32\u t
确保读写器都同意长度大小,否则无法编译。这无助于解决令人讨厌的问题,但这本身就是个问题。