Ваша основная проблема заключается в том, что когда вы читаете строку, \n
в конце первой строки все еще находится во входном буфере. Поскольку getline
просто читает до следующего \n
во входном буфере, вы получаете пустую строку.
ИМО, тебе бы лучше было делать все по-другому. Начнем с того, что вместо явного преобразования с 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;
}