您的主要问题是,当您读取字符串时,\n
第一行末尾的 仍在输入缓冲区中。由于getline
只是在输入缓冲区中读取到下一个\n
,因此您会得到一个空字符串。
IMO,你最好做点不同的事情。首先,不要使用 进行显式转换wcstombs_s
,最好只使用wofstream
,它将自动处理转换。你通常也应该使用[w]ifstream
and[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;
}