簡體   English   中英

C ++中的二進制文件I / O

[英]Binary file I/O in C++

我編寫了一個代碼,將學生信息存儲到二進制文件中,並根據需要獲取信息。 但是我沒有得到想要的輸出。 當我嘗試從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();
}
file.write((char*) &a, sizeof(student));

我確定在課堂上教過sizeof ()時,會告訴您它返回結構的大小,這是一個常量值。

您的student結構包含一個std::string ,這是一個長度不受限制的文本字符串。 問問自己,對於這個短結構, sizeof ()如何返回一個相對較小的值(大約十幾個字節),它是否包含幾個字符的短字符串或幾兆字節。

std::string或任何其他類是二進制結構。 實際的文本不是字符串的一部分。 std::string類為它所保存的文本字符串動態分配內存,並維護指向動態分配內存的內部指針。

在這里,將那些指針的二進制值寫入文件不會產生任何作用。 隨后讀取時,它們很可能是指向不再存在的內存的指針。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM