-2

我需要在程序中处理二进制文件,我已经看到使用了 reinterpret_cast 以及 c_str()。

这是使用 c_str() 的代码片段:

fstream aFile;
string sample = "hello this is a line of code";
aFile.open("newFile.bin", ios::out | ios::binary);
aFile.write(sample.c_str(), sample.size());
aFile.close();

这是使用 reinterpret_cast 的代码片段:

fstream aFile_2;
string sample_2 = "hello this is a line of code";
aFile_2.open("newFile_2.bin", ios::out | ios::binary);
aFile_2.write(reinterpret_cast<char *>(&sample_2), sizeof(sample_2));
aFile_2.close();

当我写入使用 reinterpret_cast 的二进制文件时,我得到了乱码......当我将数据读回我的程序时,这是有道理的。但是,当我使用 c_str() 时,数据在我写入的文件中是有意义的(没有乱码)。

而且,在使用 c_str() 写入文件后,我可以使用 getline 或 >> 轻松检索数据:

string result = "";
aFile.open("newFile.bin", ios::in | ios::binary);
//aFile >> result;
getline(aFile, result);
cout << "result = " << result << endl;
aFile.close();

所以,我的问题是,哪个更适合用于二进制文件:reinterpret_cast 还是 c_str()?为什么?

就个人而言,似乎 c_str() 更好......

谢谢你们 :)

4

2 回答 2

0

虽然 的行为aFile_2.write(reinterpret_cast<char *>(&sample_2), sizeof(sample_2));已明确定义,但std::string对象的状态在进程之外毫无意义。澄清一下,这并没有写入std::string对象管理的缓冲区的内容。如果您打算将乱码写入文件,那么这会更好。

aFile.write(sample.c_str(), sample.size());确实写入了字符串缓冲区的内容(在这种情况下,即“你好,这是一行代码”),我认为这是您想要的。如果是这样,那就更好了。我会亲自使用sample.data(),尽管这并不重要。此外,我将使用向量而不是std::string表示二进制数据,因为后者用于以空字符结尾的文本。

至于读取,getline对于读取二进制文件没有用。它适用于这种情况,因为内容是文本的。

于 2019-01-23T02:31:23.170 回答
0

这个问题没有意义。

文件是字节流。在将数据写入文件之前,您必须决定如何将该数据表示为字节流。您需要准确地确定文件中需要包含哪些信息以及如何将其表示为字节。这可能还需要记录您如何确定需要读取多少字节以及如何确定哪些信息存储在文件中的哪个位置。

然后,您可以编写代码,以约定的格式写入数据。您可以编写代码来读取以该格式存储的数据。

但是,如果不准确了解要记录哪些信息以及如何记录这些信息,就无法分析代码。以决定的格式写入所需数据的代码片段是最好的。如果您不知道如何读取数据或不知道应该以什么格式写入什么信息,那么实际上就不可能判断数据是否正确写入。

于 2019-01-23T05:16:35.400 回答