0

だから、私が書いたバイナリファイルから構造を読み込もうとしていますが、何かが間違っているようです。これが私のメインです:

//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 つ入力すると 1/5 5/5 5/5 と表示されますが、1/5 と 2/6 などの分数を 2 つ入力すると2/6 6/6 6/6.

4

1 に答える 1

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

それは意味がありません。クラス インスタンスを格納するには、バイナリ形式に変換する必要があります。実際にはしなかったのに、そうしたふりをするようにコンパイラーに指示することはできません!

ファイルはバイトのストリームです。ファイルに何かを保存するには、バイトのストリーム (またはチャンク) に関して指定されたフォーマットが必要です。コンパイラをだまして、完全に指定されていない、または任意の形式でメモリの一部をディスクに保存することはできません。ポインターが含まれている可能性があります。

ここに別の問題があります:

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

おっと、f何も指していません。これで、データを特定の場所に読み込まないようにコンパイラに指示しました。

于 2013-05-25T22:15:27.060 に答える