Информация об изменениях

Сообщение Re: Считать из файла строки в вектор от 17.09.2019 6:39

Изменено 17.09.2019 6:47 rg45

Re: Считать из файла строки в вектор
Здравствуйте, 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/dde9e62ea8b0be62

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 << L"\n";
   }
}

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);
   }
}
Re: Считать из файла строки в вектор
Здравствуйте, 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/dde9e62ea8b0be62

#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 << L"\n";
   }
}

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;
}