none
С++. Как правильно сохранять структуры разного размера в одном файле? RRS feed

  • Вопрос

  • У меня есть структуры (struct) одного типа, но разного размера (длины строк в них отличаются). Как можно их загнать в файл, чтобы потом можно было по одной выгружать? Не используя всякие стоп-символы, которые в принципе могут попадаться в самих структурах.
    P.S. Пишу на Visual Studio 2008. Может быть, что-то есть в её арсенале?..

Ответы

Все ответы

  • Уточните: C++ обычный или управляемый C++.NET (CLI)?

    И приведите код структур.

  • Использовать сериализацию данных, а для этого все структуры сохранить в list или vector и уже его сериализовать - FAQ:STL:C++ сериализация данных, http://stackoverflow.com/questions/234724/how-to-serialize-in-c.

    Либо сохранять в xml/json формате руками, если не сложные структуры данных. Также можно перед стркой писать ее размер, но тогда все равно потребуется разделитель.


    Для связи [mail]

    • Помечено в качестве ответа Vendicare 9 июня 2012 г. 10:23
    5 июня 2012 г. 11:43
  • C++.NET (CLI)

    Вот код:

    struct FILM
    {
    	int Year; // год проката
    	int Time; // продолжительность
    	char *Title; // название
    	char *Genre; // жанр
    	char *Director; // режессёр
    	char *Actors; // актёры
    	char *Awards; // награды
    	char *Plot; // сюжет
    	char *Native; // страна-производитель
    	unsigned Cash; // кассовые сборы
    	unsigned Budget; // бюджет
    	FILM *next;
    };

    5 июня 2012 г. 15:33
  • C++.NET (CLI)

    Вот код:

    struct FILM
    {
    	int Year; // год проката
    	int Time; // продолжительность
    	char *Title; // название
    	char *Genre; // жанр
    	char *Director; // режессёр
    	char *Actors; // актёры
    	char *Awards; // награды
    	char *Plot; // сюжет
    	char *Native; // страна-производитель
    	unsigned Cash; // кассовые сборы
    	unsigned Budget; // бюджет
    	FILM *next;
    };

    У-у... Для чего у управляемом коде указатели? Это уже неуправляемый код! Раз уж пишете на C++.NET то используйте управляемый указатель ^. И память выделяйте соответственно с помощью gcnew.

    Более того, даже в нативном C++ использование указателей считается моветоном, и прикладных разработчиков за их применение бьют ногами... Сырые указатели позволено использовать системным программистам. А прикладным с лихвой достаточно умных указателей и стандартных коллекций (из любого используемого фреймворка).

    Подытоживая: Use the C++, Luke! Приведённый код структуры - это по сути язык C. Если перейдёте на C++, то автоматическая сериализация решит ваши проблемы.

    5 июня 2012 г. 20:59
  • Вопросы по сериализации первый пример с boots::serialization::access.

    1) Где на ЖД храниться архив, в который занесён экземпляр класса?

    2) Как заносить в этот архив множество экземляров по одному (надо создавать архив для каждого экз-ра)? И как их оттуда вытаскивать?