0

何らかの理由で私の銀行のスクリプトが機能していません。具体的には、はsearch()機能しません。おそらくそれが原因で、なぜそうならないのかは理解できif(obj.returnId() == n)ますが、修正する方法がわかりません。アカウントを検索すると、最後に作成されたアカウントのみが検索され、以前のアカウントは検索されません。これが私のコードです:

#include "stdafx.h"
#include <iostream>
#include <string>
#include <string.h>
#include <fstream>
#include <Windows.h>
#include <conio.h>
using namespace std;
bool loop = true;

class account
{
          int id;
         char name[40];
         char password[40];
public:
          void getData()
          {
                     cout << "\nEnter your name: ";
                     cin >> name;
                     cout << "\nEnter ID: ";
                     cin >> id;
                     cout << "\Enter pass: ";
                     cin >> password;
          }
          void showData()
          {
                     cout << "\nName: ";
                     puts(name);
                     cout << "\nID: " << id;
                     cout << "\n";
          }
          int returnId()
          {
              return id;
          }
};

void createAccount()
{
    account obj;
    ofstream fileCreate;
    fileCreate.open("accounts.dat", ios::binary|ios::app);
    obj.getData();
    fileCreate.write((char*)&obj,sizeof(obj));
    fileCreate.close();
}

void display()
{
    account obj;
    ifstream fileRead;
    fileRead.open("accounts.dat", ios::binary);
    while(fileRead.read((char*)&obj, sizeof(obj)))
    {
        obj.showData();
    }
    fileRead.close();
}

void search(int n)
{
    account obj;
    ifstream fileRead;
    fileRead.open("accounts.dat", ios::binary);
    while(fileRead.read((char *) &obj, sizeof(obj)) );
    {
        fileRead.seekg(0,ios::beg);
        if(obj.returnId() == n)
        {
            obj.showData();
        }
        else {
            cout << "\nUser not foud!\n";
        }
    }
    fileRead.close();
}








void main()
{
    cout << "Welcome to the Bank.\n\n";

    while (loop==true)
    {
        char choice[10];
        cout << "Please select an option:\n";
        cout << "------------------------------------------------\n";
        cout << "(a)Log into an account\n(b)Create an account\n(s)Search an account\n(e)Exit\n";
        cout << "------------------------------------------------\n";
        cout << "Choice: ";
        cin >> choice;
        choice[0] = tolower(choice[0]);
        cout << "\n------------------------------------------------\n\n";

        switch (choice[0])
        {
        case 'a':
            display();
            break;
        case 's':
            int n;
            cout << "Enter the ID of the account: ";
            cin >> n;
            search(n);
            break;
        case 'b':
            createAccount();
            break;
        case 'e':
            loop = false;
            break;
        default:
            system("CLS");
            cout << "The option \"" << choice[0] <<  "\" is invalid.\n\n\n\n";
            break;
        }

    };
    cout << "\n\n\n";
    cout << "Click anything to exit.";
    getch();
}
4

4 に答える 4

2

問題は、この行の最後にあるセミコロンです。

while(fileRead.read((char *) &obj, sizeof(obj)) );

これにより、このループの本体は空になります。したがって、基本的にファイル全体を読み取り、最後のエントリを除いて結果を破棄します。

これも取り除く:

fileRead.seekg(0,ios::beg);

なぜそれが必要なのかわかりません。最初のエントリを何度も読ませるだけです。

于 2012-10-27T14:52:46.523 に答える
1

もう1つのエラーは、すべてのアカウントをテストし、すべてが失敗した場合にのみ、「ユーザーが見つかりません」と言う必要があることです。テストが失敗するたびに、ループ(セミコロンを削除した場合)は「ユーザーが見つかりません」と表示されます。

于 2012-10-27T14:57:51.070 に答える
0

ファイルからエントリを読み取るたびに、位置を先頭にリセットするため、探しているエントリが見つからない可能性があります。これは、ループが永久に実行され、同じエントリを何度も読み取り、検索するエントリが見つからないことを意味します。

于 2012-10-27T14:49:28.753 に答える
0

シークが問題になる可能性があります。

while(fileRead.read((char *) &obj, sizeof(obj)) ) //;
{
    // seek to start?
    //fileRead.seekg(0,ios::beg);
    ...
}

http://www.boost.org/doc/libs/1_51_0/libs/serialization/doc/index.htmlをご覧ください

さておき、使用

cout << "text" << endl;

プラットフォームに依存しない改行用。

于 2012-10-27T14:50:04.137 に答える