当我尝试将文本转换为二进制格式时,我遇到了问题:
如下面的代码所述,它适用于test3.txt或test4.txt,但是,fout3.write(str1.data() ,len);
不适用于test5.txt(真的让我感到困惑)所以我使用了{{1}相反,它运作良好。
fout3.write(reinterpret_cast<char *>(& str1) ,len);
但另一个问题出现在我面前。当我试着阅读刚才写的test6.txt时, 它失败了,有这样的错误。
#include <cassert>
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main(void)
{
ofstream fout("test3.txt", ios::out | ios::binary);
fout << "ABC\n";
fout.close();
int test = 111;
ofstream fout1("test4.txt", ios::out | ios::binary);
fout1.write(reinterpret_cast<char *>(&test), sizeof(int));
fout1.close();
int test2;
ifstream fin("test4.txt", ios::in | ios::binary);
fin.read(reinterpret_cast<char *>(&test2), sizeof(int));
cout << test2 << endl;
string str1 = "ATEGWGEf";
int len = str1.length();
cout << str1.data() << endl;
ofstream fout3("test6.txt", ios::out | ios::binary);
// fout3.write(str1.data() ,len);
fout3.write(reinterpret_cast<char *>(& str1) ,len);
fout3.close();
string line;
ifstream fin2("test6.txt", ios::in | ios::binary);
fin2.read(reinterpret_cast<char *>(&line),300);
cout << line << endl;
return 0;
}
与此错误一起,我成功地将二进制test6.txt转换为文本。我真的想知道为什么以及如何解决这个错误。
THX!
答案 0 :(得分:2)
您不能只是将指向类的指针转换为char *并将数据写入文件。 例如,您如何期望解释指针?在阅读时,它们不再指向有效地址,并且在写入时不需要考虑,只需编写地址。
答案 1 :(得分:2)
使用std::string::c_str()
获取指向字符串内部缓冲区的指针。
答案 2 :(得分:1)
阅读的问题就在这一行:
fin2.read(reinterpret_cast<char *>(&line),300);
你在做什么是将string
对象的地址转换为char *
指针。然后你要覆盖它的内部内容。这是错误的,它永远不会奏效。有人建议使用它:
fin2.read(reinterpret_cast<char *>(&line.c_str()),300);
它可以编译,但它应该在运行时崩溃。原因是std::string::c_str()
会返回const char *
,而您正在使用const
丢弃reinterpret_cast
。也
这是UB
因为C ++ 98标准说:
程序不得改变此序列中的任何字符。