【问题标题】:Reading a structure from a binary file in c++从 C++ 中的二进制文件中读取结构
【发布时间】:2013-05-25 22:13:48
【问题描述】:

所以我试图从我编写的二进制文件中读取结构,但似乎有问题。这是我的主要内容:

//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。

【问题讨论】:

  • 然后我会担心以后的错误测试。
  • 大部分变量没有正确初始化。

标签: c++ file file-io


【解决方案1】:
    datafile.write(reinterpret_cast<char *>(f),sizeof(Fraction));//stores fraction to file

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

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

还有一个问题:

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

糟糕,f 没有指向任何东西。所以你现在告诉编译器不要把数据读到任何地方。

【讨论】:

  • 您能详细说明一下吗?那应该是什么?
  • 您必须将要存储的内容转换为以字节为单位指定的某种特定格式。第一个字节应该是什么?应该是分子还是分母?它应该是分子的最高有效字节还是最低?您必须先确定文件格式,然后才能写入文件。否则,只能靠运气了。
  • 我已经看到以前用于读取文件头的技术。除了指针,您可以直接读取/写入结构到文件。
  • 如果一个人选择了1,但如果他们没有选择呢?
  • 我认为您正在考虑“文件格式”而不是“将数据写入文件”。将简单的 ASCII 文本写入文件也可能会遇到问题(在 Windows 下,它们会为您发出的每个 \n 输出 \r\n。)现在我写了SSWF library,我知道我在说什么。您可以将结构写入文件就好了。
猜你喜欢
  • 2011-05-08
  • 1970-01-01
  • 1970-01-01
  • 2012-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多