11

文字列をバイナリファイルに書き込むのに問題があります。これは私のコードです:

ofstream outfile("myfile.txt", ofstream::binary);
std::string text = "Text";
outfile.write((char*) &text, sizeof (string));
outfile.close();

それから、読んでみます、

char* buffer = (char*) malloc(sizeof(string));
ifstream infile("myfile.txt", ifstream::binary);    
infile.read(buffer, sizeof (prueba));
std::string* elem = (string*) buffer;
cout << *elem;
infile.close();

私はそれを機能させることができません。すみません、私はただ必死です。ありがとうございました!

4

7 に答える 7

11

std::string をバイナリ ファイルに書き込むには、最初に文字列の長さを保存する必要があります。

std::string str("whatever");
size_t size=str.size();
outfile.write(&size,sizeof(size));
outfile.write(&str[0],size);

それを読み込むには、プロセスを逆にして、最初に文字列のサイズを変更して、十分なスペースを確保します。

std::string str;
size_t size;
infile.read(&size, sizeof(size));
str.resize(size);
infile.read(&str[0], size);

文字列は可変サイズなので、そのサイズをファイルに入れないと正しく取得できません。c-string または同等の string::c_str() 呼び出しの最後にあることが保証されている '\0' マーカーに頼ることができますが、それは良い考えではありません。

  1. ヌルをチェックする文字列を文字ごとに読み込む必要があります
  2. std::string は合法的に null バイトを含むことができます (ただし、c_str() の呼び出しが混乱を招くため、実際にはすべきではありません)。
于 2016-05-04T19:03:12.190 に答える
10

この線

outfile.write((char*) &text, sizeof (string));

は正しくありません

sizeof(string)文字列の長さを返すのではなく、文字列型のサイズをバイト単位で返します。

また、C キャストを使用してテキストをキャストしないchar*でください。適切なメンバー関数を使用して char* を取得できます。text.c_str()

あなたは単に書くことができます

outfile << text;

代わりは。

于 2012-06-03T19:51:46.640 に答える
3
  • なぜstd::stringクラスへのポインタを使用しているのですか?
  • 内部の文字列の実際のサイズではなく、オブジェクトのサイズを返すため、sizeofwith を使用しないでください。std::stringstd::string

試してみてください:

string text = "Text";
outfile.write(text.c_str(), text.size());

また

outfile << text;
于 2012-06-03T19:52:46.310 に答える
1

そのまっすぐなクレイジーキャストの代わりに、おそらくc_str()charポインターも取得するために使用する必要があります。

于 2012-06-03T19:49:04.800 に答える
-1

このコードスニペットを試してください。

/* writing string into a binary file */

  fstream ifs;
  ifs.open ("c:/filename.exe", fstream::binary | fstream::in | fstream::out);

  if (ifs.is_open())
  {
   ifs.write("string to binary", strlen("string to binary")); 
   ifs.close();
  }

これが良い例です

于 2012-09-25T05:07:56.577 に答える