主な問題は、文字列を読み取るとき\n
に、最初の行の終わりにあるがまだ入力バッファにあることです。入力バッファでgetline
次の文字列を読み取るだけなので、空の文字列が得られます。\n
IMO、少し違ったやり方をしたほうがいいでしょう。まず、を使用した明示的な変換の代わりに、変換を自動的に処理するwcstombs_s
を使用する方がよいでしょう。wofstream
また、通常はを使用する必要があります。同じストリームを介して読み取りと書き込みを行う場合[w]ifstream
を[w]ofstream
除きます。
#include <fstream>
#include <string>
#include <windows.h>
int main() {
char name[] = "simtestagain.txt";
std::wofstream ff(name);
std::wstring my_string(L"Name with spaces");
// avoid unnecessary flushes by using "\n" instead of std::endl;
ff << 1 << "\n" << my_string << "\n" << 2 << "\n";
ff.close();
std::ifstream ff2(name);
int a,b;
char ignore;
std::string my_second_string;
ff2 >> a >> std::noskipws >> ignore;
std::getline(ff2, my_second_string);
ff2 >> b;
MessageBox(NULL, my_second_string.c_str(), "", MB_OK);
return 0;
}
ただし、これは、マルチバイト文字としてファイルに書き込んだ文字列が実際にはすべてシングルバイト文字としてエンコードされるという事実に依存するため、から書き込んだものは。std::wstring
としてきれいに読み取られることに注意してくださいstd::string
。この場合は正しいですが、一般的な場合はそうではありません。それが機能するのは、コンテンツがすべて基本的にプレーンASCIIである場合のみです(したがって、ワイド文字や変換などで遊ぶ理由は基本的にありませんでした)。
ワイド文字をサポートしたい場合は、ワイド文字として書き込んだものをワイド文字として読み戻す必要があります。これにより、ファイルの処理も少し簡素化されます。同じストリームを介してデータの読み取りと書き込みを行うことができます。
#include <fstream>
#include <string>
#include <windows.h>
int main(){
char name[] = "simtestagain.txt";
std::wfstream ff(name);
std::wstring my_string(L"Name with spaces");
ff << 1 << "\n" << my_string << "\n" << 2 << "\n";
ff.seekg(0);
int a,b;
wchar_t ignore;
std::wstring my_second_string;
ff >> a >> std::noskipws >> ignore;
std::getline(ff, my_second_string);
ff >> b;
MessageBoxW(NULL, my_second_string.c_str(), L"", MB_OK);
return 0;
}