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

클래스를 저장하는 것은 매우 약해서 함수 포인터 및 vTable로 인해 제대로 다시 읽지 않을 수 있습니다. 적절한 직렬화 라이브러리를 대신 사용하십시오. –

+0

또한 'n'문자입니까? if : obj.returnId() == 'n') ' – Annabelle

+0

이 예제에서 많은 코드를 제거하고 여전히 오류가 발생할 수 있습니다. 다음에 최소한의 예를 게시 해보십시오. – Beta

답변

2

귀하의 문제는이 라인의 끝에 세미콜론입니다. 따라서 기본적으로 전체 파일을 읽고 마지막 항목을 제외하고 결과를 버립니다.

도이 제거 :

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; 

를 사용합니다. 이 루프를 만드는

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

빈 몸을 가지고

+0

'\ n'은 (는) 플랫폼에 무관심한 개행 문자입니다. endl은 '\ n'에 플러시 연산을 더한 것입니다. – john

1

다른 오류는 모든 계정을 테스트하고 모두 실패했을 때 '사용자를 찾을 수 없음'이라고 말하면됩니다. 루프 (세미콜론을 제거했을 때)는 실패한 테스트마다 '사용자를 찾을 수 없음'이라고 말합니다.

관련 문제