запись в двоичном файле в C ++ - PullRequest
1 голос
/ 02 ноября 2011

Я создал класс для ученика. Это класс.

class student
{
  int rollno,marks;
  char name[20];


 public:
    void show();
    void get();
    int filecreate(const string &,fstream &);
    int fileopen(const string &,fstream &);
    static int add(const student &,fstream &);
    static int read(const student &,fstream &,int);
    static int update(const student &,fstream &,int);
    int showall(fstream &);
    int view(fstream &,int );
    int adddummy(fstream &);
};

Это мой метод добавления для записи записи в двоичный файл.

int student::add(const student &s,fstream &fp)
{
        fp.seekp(0, ios::end);
        if(fp.write((char*)&s,sizeof s))
            return 1;
        return 0;
}

Если я запишу значения объекта s, каковы значения, записанные в файл. Это только роллно, знаки и имя (только для членов данных?) Теперь я хочу добавить члена для fstream. после добавления члена, если я напишу файл, какие данные будут записаны в файл (будут ли значения fstream также записаны в файл?)

Ответы [ 4 ]

4 голосов
/ 02 ноября 2011

Я думаю, что вы в первую очередь хотите добиться сериализации экземпляра класса.

Этот вопрос и ответы на него могут быть полезны для этой цели. Особенно стоит обратить внимание на эту ссылку (приведенную в ответе с самым высоким рейтингом) на часто задаваемые вопросы по сериализации в C ++.

2 голосов
/ 02 ноября 2011

Какие значения записаны в файл.Это только роллно, метки и имя (Только члены данных?).

В вашем случае - да, потому что у класса нет vtable или родителей.

, если язаписать файл, какие данные будут записаны в файл (будут ли значения fstream также записаны в файл?)

Да.fstream значения будут для вас совершенно бессмысленными, но они будут записаны.Однако, если вы прочтете сохраненное значение таким же образом, объект станет непригодным для использования, поскольку fstream может содержать дескрипторы, указатели и т. Д. - данные, которые будут недействительными во втором запуске.

Этот метод также имеетпроблемы двоичной совместимости - каждый раз, когда вы добавляете или изменяете членов класса, ранее сохраненные вами данные становятся непригодными для использования.

1 голос
/ 02 ноября 2011

Я не уверен, что пойму ваш вопрос, но если вы добавите элемент данных fstream foo; после name в ваш class student, то этот участник также будет записан.Однако написание fstream обычно бессмысленно, потому что (по крайней мере, в системах Unix) открытые файлы не остаются открытыми после завершения процесса.Вы должны спросить себя, что произойдет, когда вы снова прочитаете эти данные (и как вы их прочитаете).Чтение fstream, которое вы написали таким образом, не имеет смысла.

И запись двоичных данных обычно является ошибкой, когда это делает новичок.Дело в том, что двоичные данные очень хрупкие.Например, в вашем примере вы можете позже захотеть увеличить размер name[20] до более высокого значения (например, name[32]), потому что вы полагаете, что у некоторых людей действительно длинные имена.Если вы это сделали, и если вы записали все данные для своей школы в двоичном виде (когда приложение использовало name[20]), вы не сможете прочитать их обратно (без кодирования процедур преобразования) с приложением, имя котороговырос до name[32].

Именно поэтому обычно целесообразно использовать какой-либо инструмент более высокого уровня (например, базу данных, такую ​​как MySQL) или представлять долговременные данные в текстовых формах, используя стандарты, такие как * 1014.* XML или JSON или YAML .Конечно, у него есть недостатки: чтение и запись данных сложнее в коде и медленнее в исполнении.Но текстовые данные легче отлаживать, поскольку программист может просматривать их в обычных редакторах.

0 голосов
/ 02 ноября 2011

Библиотека GDBM , о которой я упоминал в комментарии, является библиотекой функций базы данных GNU, которые используют расширяемое хэширование и работают аналогично стандартному UNIX dbm ; он управляет индексированной ассоциацией ключей (произвольная последовательность произвольных байтов) со значениями (аналогично, произвольная последовательность произвольных байтов).

Помимо использования форматов текстовой сериализации, таких как JSON, XML или YAML, вы можете использовать библиотеку сериализации C ++, такую ​​как s11n

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...