Двоичный поток или что-то вроде этого, чтобы сохранить класс, как std :: vector в файл? - PullRequest
2 голосов
/ 25 ноября 2010

Я плохо разбираюсь в библиотеке IOstream, поскольку привык к stdio и так далее, но у меня возникла проблема, которую я надеялся решить в IOstream, но обнаружил, что, вероятно, нет. Так что я довольно новичок в стандартных библиотеках C ++, но довольно хорошо разбираюсь в C ++ OOP / Classes и так далее.

Так что я не могу использовать код вроде

printf (stream, "...", C);

, если C относится к агрегатному типу, потому что я не могу создать новые параметры строки формата, такие как% mytupe. Также я не могу ожидать правильного поведения

fwrite/fread (&C, sizeof(C), 1, stream)

если T содержит поля, которые являются указателями, потому что fwrite / fread сохранит / загрузит значение указателя, но не значение, сохраненное в памяти, где указатель ссылается на:

class MyClass
   {...
    private:
       {typename} Tp* Data;
   } C;

Меня не волнует первое ограничение, потому что я могу написать функцию, которая преобразует объект каждого моего класса в текстовую строку, это работает, даже если последнее не может быть легко решено. Например, я попытался создать функцию, которая сохранит каждый класс в двоичном файле, но у меня возникло много проблем с персоналом, например, удача частичной специализации шаблона и т. Д. (Вопрос имеет значение).

Устали от ошибок и ошибок при переписывании стандартного кода (например, собственные классы строк и держателей файлов). Я надеялся, что изучение (наконец-то!) Стандарта (написанного умными людьми и хорошо проверенной :) библиотекой поможет мне, так как Я много читал, что стандартная библиотека C ++ решает первую проблему с использованием потоков. Я могу перегрузить operator << и operator >> или так далее, чтобы быть уверенным, что мой класс будет сохранен или прочитан из текстового файла должным образом. Но как насчет бинарных файлов, которые для меня гораздо важнее?

Что мне делать, если я хочу сохранить объект такого класса, как vector, например, в двоичный файл? Использование << и >> вообще не дает результатов, поскольку говорит, что в векторе нет перегруженных операторов << и >>, но даже если бы оно имело, это дало бы текстовые данные.

Персонал как

vector <MyClass> V;
...
ofstream file ("file.bin", ios::binary);

int size1 = ;
file.write((const char*)&V.size(), sizeof(V.size()));
file.write((const char*)&V[0], V.size() * sizeof(MyClass));

не подходит (и не сильно отличается от использования fwrite), так как он сохраняет значение (адрес) поля указателя, но не данные, хранящиеся там (также, что, если я объявлю «двумерный» вектор как вектор > ??). Итак, если произошла перегрузка оператора vector << like </p>

template <class T> vector
  {public:
   ...    
     ostream operator << () const
        {ostream s;
         for (uint32_t k = 0; k < size(); k++)
            s << s << this->operator[] (k);
         return s;
        }
   private:
      T* Data;
  };

и если каждый T :: operator << тоже был перегружен одинаково (для MyClass - для предоставления потока данных, хранящихся в MyCLass :: Tp), он был сохранен. </p>

(Я знаю, я знаю, должен быть итератор, но, может быть, я совершил более серьезную ошибку из-за полного недопонимания потоков? В любом случае, я просто говорю об идее.)

Ну, это способ конвертировать данные в текст, а не получать двоичные данные, поскольку они хранятся в памяти, но я знаю, что можно написать интерфейс для работы с двоичными данными таким же образом (возможно, не используя < <и >> но имена функций, но это может быть точно)! Задача: это было сделано в стандартной библиотеке C ++ или где-то еще (другая библиотека с открытым исходным кодом для C ++)? Да, да, чтобы правильно записать вектор в файл в одну строку. (Я буду очень удивлен, если он не включен в стандартный C ++, потому что, как люди сохраняют данные, которые они работают, в файлы, если они хотят использовать многомерные динамические массивы?)

1 Ответ

2 голосов
/ 25 ноября 2010

Вы ищете термин "сериализация", и вы можете использовать для этой цели библиотеку Boost :: Serialization .

...