Считать из файла строки в вектор
От: mdaii http://delphifeeds.ru
Дата: 16.09.19 22:00
Оценка:
Сохраняю вектор юникодовых строк в файл таким образом.

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

А как сделать обратную операцию? Т. е. считать из файла строки в вектор.
Отредактировано 16.09.2019 22:32 mdaii . Предыдущая версия .
файл с++
Re: Считать из файла строки в вектор
От: b0r3d0m  
Дата: 17.09.19 02:13
Оценка: +1
Почему на протяжении всего кода для представления символов строки использовалась абстракция TCHAR, а под конец было принято решение взять размер wchar_t при записи в файл? Тогда бы уж от TCHAR и брали бы размер (или, лучше, брали бы sizeof от нулевого элемента строки / использовали стримы и operator<<).

Для чтения getline можно взять, что с ним не так?
Re: Считать из файла строки в вектор
От: rg45 СССР  
Дата: 17.09.19 06:39
Оценка: 3 (1)
Здравствуйте, 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;
}
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 17.09.2019 11:45 rg45 . Предыдущая версия . Еще …
Отредактировано 17.09.2019 6:54 rg45 . Предыдущая версия .
Отредактировано 17.09.2019 6:47 rg45 . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.