为什么数据没有在此文件中正确写入/读取?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么数据没有在此文件中正确写入/读取?相关的知识,希望对你有一定的参考价值。

以下代码只接受来自用户的一些数据,并将其写入二进制文件。第一个对象被写得很好,但之后就搞砸了。

下面是在将第一个对象写入文件后读取文件的输出。

ROLL NO.      NAME          MARKS
234            Sansa           67

一切都很好,就像我期望的那样。但是当我在文件中附加另一个对象时,就会发生这种情况。

ROLL NO.      NAME          MARKS
234         SansSnow           78
564         Jon Snow           78

卷号保持不变,但是先前对象的名称与最后一个对象的名称混淆,并且它们的标记被最后一个对象的标记覆盖。为什么会这样?

码:

#include <iostream>
#include <fstream>
#include <iomanip>

using namespace std;

fstream file;

class Student
{
protected:
    int rollno;
    char name[30];
    float marks;
public:
    void getData()
    {
        cout<<"ENTER THE DATA..."<<endl<<endl;
        cout<<"Roll Number : ";
        cin>>rollno;
        fflush(stdin);
        cout<<"Name : ";
        cin.getline(name,30);
        cout<<"Marks : ";
        cin>>marks;
    }
    void displayData()
    {
        cout<<"
"<<rollno;
        cout<<setw(17)<<name;
        cout<<setw(13)<<marks;
    }
    void writeData()
    {
        file.open("StudentData.dat", ios::app|ios::binary);
        file.write((char*)this, sizeof(this));
        file.close();
    }
    void readData()
    {
        file.open("StudentData.dat",ios::in|ios::binary);
        while(file.read((char*)this, sizeof(this)))
        {
            displayData();
        }
        file.close();
    }
};

Student S1;

int main()
{
    cout<<"
MAIN MENU"<<endl<<endl;
    cout<<"1. Enter data and write to file
";
    cout<<"2. Read data from file and display
";
    cout<<"3. Exit

";
    cout<<"Enter your choice : ";
    int choice;
    cin>>choice;

    switch(choice)
    {
        case 1:{
            S1.getData();
            S1.writeData();
            cout<<endl<<endl;
            cout<<"Data written to file successfully!"<<endl;
            main();
            break;
        }
        case 2:{
            cout<<"ROLL NO."<<setw(10)<<"NAME"<<setw(15)<<"MARKS";
            S1.readData();
            cout<<endl;
            main();
            break;
        }
        case 3:{
            exitop:
            char confirmExit;
            cout<<"
Are you sure you want to exit? (Y/N) : ";
            cin>>confirmExit;
            if(confirmExit=='y' or confirmExit=='Y')
                exit(0);
            else if(confirmExit=='n' or confirmExit=='N')
            {
                cout<<"Exit Aborted.

";
                getchar();
                main();
            }
            else{
                cout<<"Invalid Input!";
                goto exitop;

            }
        }
        default:{
            cout<<"Invalid Input!";
            break;
        }
    }
    return 0;
}
答案

你只需要读写8个字节。 this是一个指针所以sizeof(this)是8(在64位机器上)。你真正想做的是获取对象的大小,所以使用sizeof(*this)sizeof(Student)

以上是关于为什么数据没有在此文件中正确写入/读取?的主要内容,如果未能解决你的问题,请参考以下文章

读取/写入 plist 的正确方法是啥?

从 BigQuery 读取数据并将其写入云存储上的 avro 文件格式

在没有读取权限的情况下写入文件

我想在写入过程完成后从我的二进制文件中读取数据,并且在没有写入过程的情况下读取数据

在 Python 中将二进制数据写入文件

AT24C02写一个数据然后读取一个数据是正确的,但是当写入多个数据时,读出数据就不正确,求指教?