繁体   English   中英

从C ++中的二进制文件读取结构

[英]Reading a structure from a binary file in c++

所以我试图从我写的二进制文件中读取一个结构,但是似乎有些错误。 这是我的主要内容:

//Fraction structure
struct Fraction
{
int num, den;
};


int main()
{
int menu_selection;
char slash;

fstream datafile; //creates file object
Fraction* f; //creates pointer for dam

//menu to the user
menu_selection = main_menu();
bool condition = true;
while (condition)
{
    switch(menu_selection)
    {
    case 1: //adds a new Fraction structure to binary file
        f = new Fraction; //dynamically allocating memory
        cout << "Enter fraction to add: "; //adds fraction to file
        cin >> f->num >> slash >> f->den;//stores input
        datafile.open("fractions.dat",ios:: out | ios:: app | ios::binary); //creates file
        datafile.write(reinterpret_cast<char *>(f),sizeof(Fraction));//stores fraction to file
        datafile.close();
        menu_selection = main_menu();
        break;
    case 2:
        menu_selection = main_menu();
        break;
    case 3: //displays the contents of the file to user
        datafile.open("fractions.dat", ios::in | ios::binary);
        while(!datafile.eof())
        {
            datafile.read(reinterpret_cast<char *>(f),sizeof(f));
            cout << f->num << "/" << f->den << " ";
        }
        datafile.close();
        menu_selection = main_menu();
        break;
    case 4:
        menu_selection = main_menu();
        break;
    case 5:
        menu_selection = main_menu();
        break;
    case 6: condition = false;
        return 0;
        break;
    default: cout << endl << "That is an invalid option. Please try again." << endl; //default option
        break;
    }
}
delete f;
}

当用户输入1时,我会为Fraction结构动态分配内存,并将其写入二进制文件。 我使用ios :: app是因为我想在再次调用该文件时将其添加到文件中。 书写或阅读功能有什么问题吗? 每当我按原样运行程序时,如果我输入一个小数,例如1/5,则显示1/5 5/5 5/5,但是,如果我输入两个小数,例如1/5和2/6,则显示2/6 6/6 6/6。

    datafile.write(reinterpret_cast<char *>(f),sizeof(Fraction));//stores fraction to file

那没有任何意义。 您必须将类实例转换为二进制格式才能存储它。 您不能只是告诉编译器假装您实际上没有这样做!

文件是字节流。 要将某些内容存储在文件中,您必须具有某种格式,该格式以字节流(或块)的形式指定。 您不能只是欺骗编译器以完全未指定或任意的格式将一些内存块存储到磁盘。 它可能包含指针!

这是另一个问题:

        datafile.read(reinterpret_cast<char *>(f),sizeof(f));

糟糕, f没有指向任何东西。 因此,您现在已经告诉编译器不要特别读取数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM