C ++中的二进制文件I / O.

时间:2016-03-03 01:28:10

标签: c++ file-io binaryfiles

我编写了一个代码,用于将学生信息存储到二进制文件中,并根据需要获取信息。但我没有得到理想的输出。当我尝试从student.bin文件中读取学生信息时,名称字段始终显示为NULL,滚动字段是最后输入的卷号。这里出了什么问题?

#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();
}

1 个答案:

答案 0 :(得分:0)

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

我确信当你在课堂上教授sizeof()时,你会被告知它会返回结构的大小,这是一个常数值。

您的student结构包含std::string,这是一个长度不限的文本字符串。问问自己sizeof()如何为这个短结构返回一个相对较小的值,大约十几个字节,或者它是否包含一个短字符串的几个字符,或者几兆字节。

std::string或任何其他类是二进制结构。实际文本不是字符串的一部分。 std::string类为它保存的文本字符串动态分配内存,并维护指向动态分配内存的内部指针。

将这些指针的二进制值写入文件,没有任何用处。随后阅读时,很可能它们将成为不再存在的内存指针。