2012-10-27 55 views
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(); 
} 
+2

保存這樣的類非常脆弱,並且由於函數指針和vTables的原因,它可能無法正確讀回。改爲使用正確的序列化庫。 –

+0

另外,'n'是一個角色嗎?如果是這樣的話:試試這個:'if(obj.returnId()=='n')' – Annabelle

+0

你可能已經從這個例子中刪除了很多代碼,但仍然產生了錯誤。下次請嘗試發佈一個最簡單的例子。 – Beta

回答

2

你的問題是在這行最後的分號:

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

這使得這個循環中有一個空的身體。所以你基本上閱讀整個文件並丟棄結果,除了最後一項。

擺脫這也:

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

我不知道爲什麼你需要的,那隻會讓你一遍又一遍讀的第一項。

+0

哇,鷹眼! –

+0

非常感謝你,我簡直不敢相信我在一段時間內把分號()分開。我感謝大家的幫助:) –

0

你可能沒有找到你要找的,因爲每一次你從文件中讀取一個條目的條目,您重置位置開始。這意味着您的循環將永遠運行,一遍又一遍地讀取相同的條目,並且永遠不會找到您要搜索的條目。

+1

除了有分號意味着seekg不在循環中。 – john

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; 

爲平臺無關的換行符。

+0

'\ n'本身就是一個平臺不可知的換行符。 endl是'\ n'外加一個沖洗操作。 – john

1

另一個錯誤是,當您測試了所有帳戶並且它們全都失敗時,您應該只說'用戶未找到'。你的循環(當你刪除分號時)在每次失敗的測試後都會說'未找到用戶'。