2016-03-03 3 views
0

Я написал код для хранения информации о студенте в двоичном файле, а также получаю информацию по мере необходимости. Но я не получаю желаемого результата. Когда я пытаюсь прочитать информацию о студенте из файла student.bin, в поле имени всегда отображается NULL, а поле roll - последний введенный номер рулона. Что здесь происходит?Двоичный файл ввода/вывода в C++

#include <bits/stdc++.h> 
using namespace std; 

class student{ 
public: 
    string name; 
    int roll; 
}; 


int main(){ 
    fstream file("student.bin", ios::in | ios::out | ios::binary); 
    int written = 0; 
    while(1){ 
     int choice; 
     student a; 
     int i; 
     cout << "0. Exit\n1. Write\n2. Read\nEnter Choice : "; 
     cin >> choice; 
     switch(choice){ 
      case 1: 
       cout << "Enter name & roll : "; 
       cin >> a.name >> a.roll; 
       cout << "You entered " << a.name << " " << a.roll << endl; 
       cout << "Enter the index : "; 
       cin >> i; 
       if(i > written){ 
        cout << "This index doesnt exist !" << endl; 
        break; 
       } 
       file.seekp(i * sizeof(student), ios::beg); 
       file.write((char*) &a, sizeof(student)); 
       written++; 
       break; 
      case 2: 
       cout << "Enter index : "; 
       cin >> i; 
       file.seekg(i * sizeof(student), ios::beg); 
       file.read((char*) &a, sizeof(student)); 
       cout << "Name : " << a.name << " Roll : " << a.roll << endl; 
       break; 
      case 0: 
       exit(0); 
      default: 
       cout << "Wrong Choice !" << endl; 
       break; 
     } 
    } 
    file.close(); 
} 
+0

Я думаю, сохранение 'std :: string', которое может использовать указатели во внутреннем, в файл не очень хорошо. – MikeCAT

+1

'#include ' Где люди продолжают получать эту идею? –

+0

Возможный дубликат [Как написать std :: string в файл?] (Http://stackoverflow.com/questions/15388041/how-to-write-stdstring-to-file) – MikeCAT

ответ

0
file.write((char*) &a, sizeof(student)); 

Я уверен, что, когда вы были научены sizeof() в классе, вы сказали, что она возвращает размер структуры, которая является постоянной величиной.

В вашей структуре student содержится std::string, которая представляет собой текстовую строку неограниченной длины. Спросите себя, как это возможно для sizeof(), чтобы вернуть относительно небольшое значение для этой короткой структуры, порядка десятка байтов или около того, содержит ли она короткую строку из нескольких символов или несколько мегабайт.

A std::string, или любой другой класс, представляет собой двоичную структуру. Фактический текст не является частью строки. Класс std::string динамически выделяет память для используемой текстовой строки и поддерживает внутренние указатели на динамически распределенную память.

Написание двоичных значений этих указателей здесь, в файле, не делает ничего полезного. Когда вы читаете впоследствии, есть вероятность, что они будут указателями на память, которые больше не существуют.

Смежные вопросы