ФорумПрограммированиеБольше языковC/C++ и C# → vector of structs в файл...

vector of structs в файл...

  • AlexanderC

    Сообщения: 270 Репутация: N Группа: Кто попало

    Spritz 14 декабря 2011 г. 2:42

    Есть stl::vector из структур

    #ifndef vStr
      typedef vector<string> vStr;
    #endif

    #ifndef Discipline
     typedef struct Discipline
     {
     vStr department;
     string name;
     string faculty;
     unsigned int hq;
     } Dis;
    #endif

    #ifndef vDis
      typedef vector<Dis> vDis;
    #endif


    где  vDis vD это вектор структур.

    Есть проблемка. При записи в файл:

    // FILE *db;
    fwrite(&vD.begin(), sizeof(Dis), vD.size(), db);

    всё ок, но вот при чтении:

    // FILE *db;
    fseek(db, 0, SEEK_END);
    long lSize = ftell(db);
    rewind(db);

    fread(&vD.begin(), sizeof(Dis), lSize/sizeof(Dis), db);

    Выдаёт ошибку: Access violation reading location…

    Как я понимаю это при попытке чтения адреса памяти.

    Вопрос: как же мне записать эту котлету в файл???

    Мэни сенкс…
  • Frozzeg

    Сообщения: 5641 Репутация: N Группа: Джедаи

    Spritz 14 декабря 2011 г. 2:45, спустя 2 минуты 33 секунды

    http://msdn.microsoft.com/en-us/library/ms233843.aspx
    You can be anything you want to be. Just turn yourself into anything you think that you could ever be.
  • AlexanderC

    Сообщения: 270 Репутация: N Группа: Кто попало

    Spritz 14 декабря 2011 г. 2:49, спустя 4 минуты 22 секунды

    // Serialization (C# and Visual Basic)
    C++?
    Спустя 19 сек.
    ну или vc++?
    Спустя 156 сек.
    интересно, кроме boost-а можно отдельно найти имплементацию сериализации…?
  • Frozzeg

    Сообщения: 5641 Репутация: N Группа: Джедаи

    Spritz 14 декабря 2011 г. 2:52, спустя 3 минуты 2 секунды

    ну или vc++?

    одна херня — .NET

    мсдн в помощь
    You can be anything you want to be. Just turn yourself into anything you think that you could ever be.
  • AlexanderC

    Сообщения: 270 Репутация: N Группа: Кто попало

    Spritz 14 декабря 2011 г. 2:56, спустя 3 минуты 40 секунд

    сенкс, курим пока… но тему можно НЕ закрывать…
  • AlexanderC

    Сообщения: 270 Репутация: N Группа: Кто попало

    Spritz 14 декабря 2011 г. 5:41, спустя 2 часа 45 минут 14 секунд

    мдеа, и всё-таки буст….
    Спс, тему можно закрывать
  • Nyaah

    Сообщения: 574 Репутация: N Группа: Джедаи

    Spritz 14 декабря 2011 г. 10:20, спустя 4 часа 38 минут 52 секунды

    Пипец, буст только ради сериализации?
    Проблема не в том, что std неправильно работает, а том, что ты сам непонимаешь того, что ты делаешь.
    fwrite(&vD.begin(), sizeof(Dis), vD.size(), db);

    Блеать, сделайте меня это разувидеть. Пральна хуярим в файл целиком структуру данных с указателями, а затем считываем и надеемся что в заданных адресах памяти будут лежать именно нужные нам данные =)
    Work, buy, consume, die
  • Frozzeg

    Сообщения: 5641 Репутация: N Группа: Джедаи

    Spritz 14 декабря 2011 г. 10:52, спустя 31 минуту 38 секунд

    Nyaah, насколько я понял, в приведенном выше примере в файл записывается только адрес вектора :D
    You can be anything you want to be. Just turn yourself into anything you think that you could ever be.
  • Nyaah

    Сообщения: 574 Репутация: N Группа: Джедаи

    Spritz 14 декабря 2011 г. 10:55, спустя 2 минуты 44 секунды

    не, мне кажется vD всё таки вектор, а не указатель на вектор
    Work, buy, consume, die
  • AlexanderC

    Сообщения: 270 Репутация: N Группа: Кто попало

    Spritz 14 декабря 2011 г. 11:52, спустя 57 минут 2 секунды

    Nyaah, как бы ты записал в файл данный вектор с структурами без сериализации?
    подскажи?
    Спустя 127 сек.
    Frozzeg- функции передаётся адрес первого элемента из вектора.
    Nyaah- ни std а stl ;)
    Спустя 120 сек.
    Пипец, буст только ради сериализации?

    вообще-то можно только нужный компонент использовать из либы ;)
    Спустя 117 сек.
    и вообще ещё буст использовал для создания потоков(многопоточности), так что уж извиняйте- велосипеды не по мне
  • Nyaah

    Сообщения: 574 Репутация: N Группа: Джедаи

    Spritz 14 декабря 2011 г. 22:27, спустя 10 часов 35 минут 29 секунд

    Nyaah, как бы ты записал в файл данный вектор с структурами без сериализации?
    Последовательно записать все элементы в файл не судьба? Только не так же, как ты вектор записывал, а поочерёдно все поля, друг за дружкой в определённом порядке.

    …Frozzeg- функции передаётся адрес первого элемента из вектора.
    Я же говорю не понимаешь, что делаешь…
    vector<Dis> !== Dis[length], это абсолютно разные вещи, и &vD - это не первый элемент вектора, это адрес самого вектора.

    Nyaah- ни std а stl ;)
    Вот ни всё ли равно.

    и вообще ещё буст использовал для создания потоков(многопоточности), так что уж извиняйте- велосипеды не по мне
    Да бля, просто скажи, что не знаешь как поток новый создать
    Work, buy, consume, die
  • AlexanderC

    Сообщения: 270 Репутация: N Группа: Кто попало

    Spritz 15 декабря 2011 г. 6:23, спустя 7 часов 55 минут 59 секунд

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


    Телега?
    Спустя 89 сек.
    Я же говорю не понимаешь, что делаешь…
    vector<Dis> !== Dis[length], это абсолютно разные вещи, и &vD - это не первый элемент вектора, это адрес самого вектора.

    http://www.cplusplus.com/reference/stl/vector/begin/
    Спустя 18 сек.
    AlexanderC
    Nyaah- ни std а stl ;)
    Вот ни всё ли равно.

    Нет…
    Спустя 247 сек.
    Да бля, просто скажи, что не знаешь как поток новый создать

    Есть много способов, многие отпадают так как компилируется без /clr (несовместимость с остальными опциями консольного приложения), и чем буст не устраивает? Вы другой религии?
  • Nyaah

    Сообщения: 574 Репутация: N Группа: Джедаи

    Spritz 15 декабря 2011 г. 8:09, спустя 1 час 45 минут 38 секунд

    бегин я незаметил, сорри, но он возвращает итератор, а не массив, ты все равно не прав )
    И да я не против буста, он охуенен, так же как и qt, так же как флекс в ас3, но меня просто нервирует, когда неразорбравшись даже в азах начинают их использовать.
    Work, buy, consume, die
  • AlexanderC

    Сообщения: 270 Репутация: N Группа: Кто попало

    Spritz 17 декабря 2011 г. 23:55, спустя 2 дня 15 часов 46 минут

    … нервный ты какой-то…

    зы я и не писал что begin возвращает массив )… ну внимательность это отдельная тема…

    а азы, что же подразумевается под этим? (для тебя)

    Кстати, так и не был предложен метод записи без буста?…
  • Nyaah

    Сообщения: 574 Репутация: N Группа: Джедаи

    Spritz 18 декабря 2011 г. 7:41, спустя 7 часов 45 минут 54 секунды

    Это после работы, так как полторы недели ипался с админкой на флексе, которая была паписана хер знает как недавно уволенным программистом. Вот он тоже не гладя в мануал херачил все данные в эррей коллекшены, не думая совершенно, нужны емы эвенты, не нужны… Херня, что у менеджеров, для которых все это писалось дохлые компики на атомах, и при загрузке сотни другой записей все начинает дико тормозить. А проблема оказалась именно в том, что ArrayCollection во флексе расширяет эвент диспатчер и при любом чихе, коллекция срёт кучей эвентов в очередо событий, как оказалось Vector в экшен скрипте на два где-то порядка шустрее работает, вот я эту куйню перелопачивал, а ты под горячую руку вместе с бустом попал, не принимай близко к сердцу xD
    Азы это понимание как работает си с памятью - человек должен понимать, что std::vector.begin() - это итератор, то есть объект который внутрях своих где-то ссылается на сам вектор, либо на массив данных в векторе, в зависимости от реализации, что манипулировать с ним это манипулировать только одним единственным элементом. Что функция fwrite принимает первым аргументом указатель на область памяти, из которой будет скопированы данные в файл, и что если тебе нужно задампить массив данных, то нужно передвать указатель именно на массив.
    Использование буста для сериализации не самый плохой метод, но ты знаешь как он работает? Ты уверен в том, что после того как ты в структуре Dis поля местами поменяешь, либо добавишь новое свойство, у тебя старые сериализованные файлы будут адекватно считываться?
    По поводу записи, был пердложен метод, но ту его телегой обозвал ) Если ты пишешь приложение не только для себя, то он на мой взгляд единственно верный, при условии что нужно именно в файл писать. Если не обязательно лить данные в файл, я бы подумал не писать ли их в бд. Запись последовательно в определённом формате (который ты собственно сам должен придумать), с указанием сигнатуры текущей версии файла, гарантирует тебе:
    а) отсутствие оверхеда
    б) в будущем отсутствие гемора с обратной совместимостью
    в) ты точно будешь знать как что работает, а не так, что звонят девочкам в тп со словами "У меня файл не загружается в новой версии", они тебя спрашивают, что случилось, на что ты им ответишь, "а хз, сериализация в бусте так работает"

    Ещё. Если пишешь на плюсах, бы ло бы неплохо юзать всётаки стримы, а не f* функции и классы вместо структур. Создаёшь класс Discipline учишь его работать с std::istream и std::ostream, после чего для записи в файл нужно будет только написать (это я так, структура файла должна быть удобочитаемой для программы, это не руководство к действию =)) что-то типа:
    void save(const std::vector<Discipline> &data) {
       ofstream outFileStream("save.bin");
       std::vector<Discipline>::const_iterator i;

       for (i = data.begin(); i != data.end(); ++i) {
           outFileStream << (*i);
       }
       outFileStream.flush();
       outFileStream.close();
    }
    Work, buy, consume, die

Пожалуйста, авторизуйтесь, чтобы написать комментарий!