Сохраняю вектор юникодовых строк в файл таким образом.
void SaveVec()
{
fstream file;
basic_string<TCHAR> awsReturn = L"\r";
TCHAR pszTemp[MAX_PATH];
vector <basic_string<TCHAR>> awsList = { _T("xxxⒶⒷⒸⒹⒺⒻⒼⒽⒾⓘⒿⓀⓁⓂⓃⓄⓅⓆⓇⓈⓉⓊⓋⓌⓍⓎⓏ"), _T("Merhaba dünya!"), _T("こんにちは世界!") };
file.open(_T("C:\\Users\\info\\AppData\\Roaming\\MayApp\\test2.ini"), ios::out);
if (file.is_open()) {
for (UINT i = 0; i < awsList.size(); i++) {
file.write((char*)awsList[i].c_str(), awsList[i].length() * sizeof(wchar_t));
// Добавляем перевод строки
file.write((char*)awsReturn.c_str(), awsReturn.length() * sizeof(wchar_t));
}
file.close();
}
}
А как сделать обратную операцию? Т. е. считать из файла строки в вектор.
Почему на протяжении всего кода для представления символов строки использовалась абстракция TCHAR, а под конец было принято решение взять размер wchar_t при записи в файл? Тогда бы уж от TCHAR и брали бы размер (или, лучше, брали бы sizeof от нулевого элемента строки / использовали стримы и operator<<).
Для чтения getline можно взять, что с ним не так?
Здравствуйте, mdaii, Вы писали:
M>Сохраняю вектор юникодовых строк в файл таким образом.
| Оригинальный пример |
| M>M>void SaveVec()
M>{
M> fstream file;
M> basic_string<TCHAR> awsReturn = L"\r";
M> TCHAR pszTemp[MAX_PATH];
M> vector <basic_string<TCHAR>> awsList = { _T("xxxⒶⒷⒸⒹⒺⒻⒼⒽⒾⓘⒿⓀⓁⓂⓃⓄⓅⓆⓇⓈⓉⓊⓋⓌⓍⓎⓏ"), _T("Merhaba dünya!"), _T("こんにちは世界!") };
M> file.open(_T("C:\\Users\\info\\AppData\\Roaming\\MayApp\\test2.ini"), ios::out);
M> if (file.is_open()) {
M> for (UINT i = 0; i < awsList.size(); i++) {
M> file.write((char*)awsList[i].c_str(), awsList[i].length() * sizeof(wchar_t));
M> // Добавляем перевод строки
M> file.write((char*)awsReturn.c_str(), awsReturn.length() * sizeof(wchar_t));
M> }
M> file.close();
M> }
M>}
M>
|
| |
M> А как сделать обратную операцию? Т. е. считать из файла строки в вектор.
Все делается простыми записью-чтением потоков. Не забываем только настраивать локаль для юникода:
http://coliru.stacked-crooked.com/a/74d977f38bf1fba0
#include <iostream>
#include <fstream>
#include <vector>
void Save(const std::vector<std::wstring>& lines, const std::string& file)
{
std::wofstream output(file);
output.imbue(std::locale("en_US.UTF8"));
for (const std::wstring& line : lines)
{
output << line << std::endl;
}
}
void Load(std::vector<std::wstring>& lines, const std::string& file)
{
std::wifstream input(file);
input.imbue(std::locale("en_US.UTF8"));
std::wstring line;
while (std::getline(input, line))
{
lines.push_back(line);
}
}
int main()
{
const std::string file = "test.txt";
const std::vector<std::wstring> saved_lines {
L"xxxⒶⒷⒸⒹⒺⒻⒼⒽⒾⓘⒿⓀⓁⓂⓃⓄⓅⓆⓇⓈⓉⓊⓋⓌⓍⓎⓏ",
L"Merhaba dünya!",
L"こんにちは世界!"
};
Save(saved_lines, file);
std::vector<std::wstring> loaded_lines;
Load(loaded_lines, file);
std::cout << "Saved and loaded lines are equal: " << std::boolalpha << (saved_lines == loaded_lines) << std::endl;
}