На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> fstream и vector
    Добрый день!

    У меня возникла вот такая проблема: есть vector<T> vec;
    где T - это любой тип (задается в шаблоне)
    template <class T>
    class Foo
    {
    ....
    vector<T> vec;
    ....
    }
    Мне нужно записать этот вектор в бинарный файл. То есть :
    fstream f;
    f.open("file",ios::out|ios::binary);
    f.write(.......................,...............);
    ///////сама информация в char*//размер в байтах//
    А как это сделать я не знаю? blink.gif
    Спасибо.
      Смотря что у тебя в векторе лежит. Если это POD-структура или один из фундаментальных типов (int, double и т. п.), то можешь смело писать так:

      f.write(reinterpret_cast<const char*>(&vec[0]),  vec.size() * sizeof(vec[0]));

      Если же это вектор классов, то записывать надо поэлементно. При этом у класса, лежашего в контейнере, необходимо завести метод, записывающий экземпляр класса в поток, и при записи вызывать этот метод.
        Цитата
        Flex_Ferrum, 15.12.03, 10:37
        POD-структура

        можно попдробнее. что такое POD структура? blink.gif
          POD - Plain Old Data. Структура в понимании языка C.
            Цитата
            Flex_Ferrum, 15.12.03, 10:37
            Если же это вектор классов, то записывать надо поэлементно. При этом у класса, лежашего в контейнере, необходимо завести метод, записывающий экземпляр класса в поток, и при записи вызывать этот метод.

            А что будет если пробовать записывать класс находящийся в контейнере, если не создавать этот метод... dry.gif
              Я пишу вот так

              class SomeClass{
              ...
              }
              vector<SomeClass> SomeClass_Massive;
              ...
              f.write( (char *) &SomeClass_Massive[i], sizeof SomeClass);


              И читаю так же.

              r.read( (char *) &SomeClass_Massive[i], sizeof SomeClass);


              Неужели я не правильно делаю?
                Цитата
                DarkKo, 17.12.03, 05:58
                Неужели я не правильно делаю?

                И все работает??? ohmy.gif
                Цитата
                Flex_Ferrum, 15.12.03, 10:37
                При этом у класса, лежашего в контейнере, необходимо завести метод, записывающий экземпляр класса в поток, и при записи вызывать этот метод.

                можешь привести пример такого класса unsure.gif
                Сообщение отредактировано: Mfcer__ -
                  Цитата
                  Mfcer__, 17.12.03, 13:20
                  можешь привести пример такого класса

                  Легко wink.gif

                  class BadClass
                  {
                  public:
                  //...
                  private:
                     std::string m_SomeString;
                  };

                  Как ты думаешь - запишется ли строка, содержащаяся в этом классе, в файл?
                    Все работает. Конечно если в классе есть вектор stl'евский, то конечно его надо отдельно писать. Но как правило мой класс, который я пишу, это набор векторов, флагой и статических массивов. Так что когда я говорю sizeof SomeClass, то он мне возвращает правильное значение.
                      И запишется тебе в файл (в моем примере) 3 указателя.
                        Цитата
                        Flex_Ferrum, 17.12.03, 14:02
                        И запишется тебе в файл (в моем примере) 3 указателя.

                        А как должен будет выглядеть метод, который будет отвечать за сохранение объекта?
                        И как правильно его нужно вызывать?
                          Flex_Ferrum
                          Ты прав.
                            Цитата
                            Mfcer__, 17.12.03, 15:41
                            А как должен будет выглядеть метод, который будет отвечать за сохранение объекта?
                            И как правильно его нужно вызывать?

                            Например так (для моего примера):

                            class BadClass
                            {
                            public:
                               void Serealize(ostream& str)
                               {
                                   int len = m_SomeString.length();
                                   str.write((char*)&len, sizeof(int));
                                   str.write(m_SomeString.data(), len);
                               }
                               void DeSerealize(istream& str)
                               {
                                  int len;
                                  str.read((char*)&len, sizeof(int));
                                  std::vecotor<char> buff(len);
                                  str.read(&buff[0], len);
                                  m_SomeString(&buff[0], len);
                               }
                            private:
                               std::string m_SomeString;
                            };


                            Дальше ты можешь сделать либо операторы потокового ввода/вывода, либо использовать алгоритмы (std::for_each, std::copy и т. п.). Вообщем, способов масса.
                            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                            0 пользователей:


                            Рейтинг@Mail.ru
                            [ Script execution time: 0,0307 ]   [ 16 queries used ]   [ Generated: 3.05.24, 20:30 GMT ]