1

構造体をバイナリ ファイルに書き込み、ユーザーにファイルを編集するオプションを与えるプログラムを作成しています。次に、プログラムは、元の構造体が書き込まれたファイル内のそのセクションを書き換える必要があります。コード:

struct Record
{
    char name     [16];
    char phoneNum [16];
    float balance;
};

int edit     ( fstream& ref)
{
    char searchVal[16];
    cout << "Enter customer name: ";
    cin.ignore();
    cin.getline(searchVal, sizeof(searchVal));
    int position = -1;
    Record buffer;
    bool found = false;

    while(!ref.eof() && !found)
    {
        position = ref.tellg();
        ref.read(reinterpret_cast<char*>(&buffer), RECORD_SIZE);
        if((strcmp(buffer.name,searchVal) == 0))
        {
            found = true;

            cout << buffer.name << " found! " << endl;

            cout << "Enter new customer name: ";
            cin.getline(buffer.name, sizeof(buffer.name));
            cout << "Enter new customer phone number: ";
            cin.getline(buffer.phoneNum, sizeof(buffer.phoneNum));
            cout << "Enter new customer balance: ";
            cin >> buffer.balance;

            ref.seekg(-(RECORD_SIZE), ios::cur);
            ref.write(reinterpret_cast<char*>(&buffer), RECORD_SIZE);

            position = ref.tellp();
            break;
        }
    }   
    if(!found)
    {
        cout << "Record not found" << endl;
    }

    ref.clear();
    ref.seekg(0L, ios::beg);
    return position;
}

基本的に、レコードが見つかり、ユーザーはそれを「編集」できますが、ファイルの最後に書き込まれており、その理由はわかりません。これについてあなたの助けに感謝します。

4

1 に答える 1

1

ios::appファイルを開くときにモードを使用しないでください。このモードは、出力が上書きではなくファイルに追加されることを意味します。代わりにios::ate、ファイルを開いたときにファイルの最後までシークするように指示する を使用して、切り捨てられないようにします。

于 2013-02-11T03:58:01.137 に答える