2012-10-27 56 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

另一个错误是,当您测试了所有帐户并且它们全都失败时,您应该只说'用户未找到'。你的循环(当你删除分号时)在每次失败的测试后都会说'未找到用户'。