c ++二进制写或读

时间:2014-01-13 20:07:05

标签: c++ fwrite

当我尝试将文本转换为二进制格式时,我遇到了问题:

如下面的代码所述,它适用于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!

3 个答案:

答案 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标准说:

  

程序不得改变此序列中的任何字符。