Сериализации/десериализации списка строк на C++


Есть ли проблемы с ниже осуществления?
Вход: с клавиатуры, список строк
Выход: сериализовать в файл с именем "out.txt" а затем восстановить в список строк, и вывод в stdout

Цель здесь не слишком много об организации кода, но я хотел бы знать, если этот код может не работать по отдельным видам ресурсов

#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>
#include <cstdlib>

using namespace std;

int main()
{
    std::vector<std::string> input;

    std::string tmp;
    while (std::cin >> tmp)
    {
        input.push_back(tmp);
    }

    std::ofstream out("out.txt", std::ios::out);
    for (std::vector<std::string>::const_iterator iter = input.begin();
         iter != input.end();
         ++iter)
    {
        out << (*iter).size() << "|" << *iter;
    }
    out.close();

    std::vector<std::string> output;
    std::ifstream in("out.txt", std::ios::in);
    if (in.is_open())
    {
        std::string tmp;
        if (!in.eof())
        {
            getline(in, tmp);
            size_t pos;
            int length = 0;
            std::string str;

            while (!tmp.empty())
            {
                pos = tmp.find('|');
                if (pos != std::string::npos)
                {
                    length = atoi(tmp.substr(0, pos).c_str());
                    str = tmp.substr(pos+1, length);     
                    tmp = tmp.substr(pos+str.size() + 1);

                    output.push_back(str);
                }
            }
        }

        in.close();
    }

    for (std::vector<std::string>::const_iterator iter = output.begin();
         iter != output.end();
         ++iter)
    {
        std::cout << *iter << "\n";
    }

    return 0;
}


5009
1
задан 5 сентября 2011 в 12:09 Источник Поделиться
Комментарии
1 ответ

Похоже, он будет работать нормально.
Вам сохранить целостность строку в файл, сохраняя его длина как отдельный объект, который вы можете проверить самостоятельно. Поэтому он должен работать нормально.

Не знаю, почему вы скопировать его в промежуточные массивы.
Почему не копировать напрямую от входа к файл, то файл на выходе?

Вы реализуете большинство других петель так точно. Но основной цикл чтения из файла-это немного громоздко и messey. С экстра класса вы можете сделать его выглядеть так же, как другие.

std::vector<std::string> output;
std::ifstream in("out.txt", std::ios::in);
MyStringReader reader;

while(in >> reader)
{
output.push_back(reader);
}
in.close();

Так что теперь нужно просто определить MyClassReader

struct MyStringReader
{
std::string data;
operator std::string const&() {return data;} // This is used in the line
}; // output.push_back(reader) and converts
// the reader object into a string before
// it is pushed

std::istream& operator>>(std::istream& stream, MyStringReader& value)
{
size_t length;
char sep = 'X';

// Use the stream operators to get the size (and separator)
// Much nicer than using tha atoi() function.
//
if ((stream >> length >> sep) && (sep == '|'))
{
// Resize the string to the correct size and put the word into it.
value.data.resize(length);
stream.read(&value.data[0], length);
}
return stream;
}

2
ответ дан 5 сентября 2011 в 07:09 Источник Поделиться