2016-03-03 117 views
0

我已經編寫了一個代碼,用於將學生信息存儲到二進制文件中,並根據需要獲取信息。但我沒有得到所需的輸出。當我試圖從student.bin文件中讀取學生信息時,名稱字段始終顯示NULL,並且滾動字段是最後輸入的滾動編號。這裏有什麼問題?C++中的二進制文件I/O

#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類爲其保存的文本字符串動態分配內存,並維護指向動態分配內存的內部指針。

將這些指針的二進制值寫到文件中並沒有什麼用處。當隨後讀取時,它們可能是指向不再存在的內存的指針。