2011-09-09 8 views
0

글쎄, 나는 몇 시간 동안이 문제로 고생했다. 하지만 몇 가지 이유로 나는 망할 mitstake를 찾을 수 없습니다. 나는 정말로 U가 마침내 나를 도울 수 있기를 바란다.데이터 읽기가 작동하지 않지만 그 이유는 무엇입니까?

다음은 사용자가 그에 대한 몇 가지 사실을 삽입해야하는 프로그램을 작성했습니다. 이름 = vname, 성 = nname, 그의 계정 = echte_kontonummer, 그의 핀과 프로그래머는이 파일과 그의 신용을 파일에 기록합니다. 나를 오해하지 마라. 배우는 목적을 위해서만 나는 이것으로 피싱을하지 않을 것이다. D.

그러나이 도구는이 데이터를 파일에 기록합니다. 지금까지는 너무 좋았지 만 지금은 줄 단위로 파일을 읽어야합니다. 추가 작업을 위해 필요한 변수로 텍스트를 구성하십시오.

그러나 몇 가지 이유로, 그것은 단지 어리석은 랜든 숫자와 문자를 읽었습니다. ,

void Kunde::laden(){ 
    string inhalt_anrede, inhalt_vname, inhalt_nname, inhalt_knummer, inhalt_pin, inhalt_guthaben; 
    int anrede, vorname, nachname, knummer, pin, guthaben; 

    system("cls"); 
    cout << "wie ist ihr nachname?" << endl; 
    cin >> nname; 

    user1.open(nname, ios::in); 

    if(!user1.is_open()){ 
     cout << "Datei nicht gefunden" << endl; 
    } 

    if(user1.is_open()){ 

    for (anrede=1;!user1.eof();anrede++){ 
     if (anrede==1){ 
      strcpy(Anrede,inhalt_anrede.c_str()); 
     } 

     else 
      getline(user1, inhalt_anrede); 

    } 
    for (vorname=1;!user1.eof();vorname++){ 
     if (vorname==2){ 
      strcpy(vname,inhalt_vname.c_str()); 
     } 

     else 
      getline(user1, inhalt_vname); 

    } 

    for (nachname=1;!user1.eof();nachname++){ 
     if (nachname==3){ 
      strcpy(nname,inhalt_nname.c_str()); 
     } 

     else 
      getline(user1, inhalt_nname); 

    } 
    for (knummer=1;!user1.eof();knummer++){ 
     if (knummer==4){ 
      echte_kontonummer=atol(inhalt_knummer.c_str()); 
     } 

     else 
      getline(user1, inhalt_knummer); 

    } 
    for (pin=1;!user1.eof();pin++){ 
     if (pin==5){ 
      echte_pin=atoi(inhalt_pin.c_str()); 
     } 

     else 
      getline(user1, inhalt_pin); 

    } 
    for (guthaben=1;!user1.eof();guthaben++){ 
     if (guthaben==6){ 
      Guthaben=atoi(inhalt_guthaben.c_str()); 
     } 

     else 
      getline(user1, inhalt_guthaben); 

    } 
    cout << "Daten erfolgreich geladen." << endl; 
    cout << vname << " " << nname << " " << echte_kontonummer << " " << echte_pin << " " << Guthaben << endl; 
    } 
    user1.close(); 
} 

와 여기를 완료하는 클래스

class Kunde{ 
private: 
    char Anrede[5]; 
    char vname[20]; 
    char nname[20]; 
    long long echte_kontonummer; 
    int echte_pin; 
    int Guthaben; 
    fstream user; 
    ifstream user1; 
public: 
    void einpflegen(); 
    void login(); 
    void einzahlen(); 
    void speichern(); 
    void laden(); 
    void zeige_guthaben(); 
}; 

BTW 언어가 독일어를하다이 문제가되지 않습니다 희망 :

마침내 여기에 파일을로드 메도이다.

여기

아, 네와 루프가

for (int guthaben=1;!user1.eof();guthaben++){ //i think this is understandable 
    if (guthaben==4){ //in this case the desired value is on line 4 (the account number. 
     getline(user1, inhalt_guthaben);  
     echte_kontunummer=atol(inhalt_knummer.c_str()); //from string to int to the desired value Guthaben. here foe e.g i only get random numbers when the console should put out this value 
    } 
} 
+1

"btw는 언어가 독일어이고 희망이 없습니다." 물론 중요합니다. 예를 들어, 수업을 끝 근처에 제시하면 독일어를 모르는 경우가 아니면 전혀 쓸모가 없습니다. 잠재 고객을 독일어로 말하는 SO 커뮤니티보다 더 많이 확보하려는 경우 게시 된 코드에서 변수 및 함수의 이름을 바꾸는 것이 좋습니다. –

+1

전체 코드를 살펴 보지 못했지만, 읽기가 아플뿐입니다.하지만 cin에서 char 배열을 읽으 려한다는 것을 알았습니다. 물론 작동하지 않습니다. 대신 std :: string을 사용하십시오. –

+0

@R. Martinho Fernandes는 중요한 변수를 지정했는데,이 나머지는 "거의"불필요하다고 생각합니다. – globus243

답변

2
for (anrede=1;!user1.eof();anrede++){ 
    if (anrede==1){ 
     strcpy(Anrede,inhalt_anrede.c_str()); 
    } 

    else 
     getline(user1, inhalt_anrede); 

} 

위의 코드는 파일의 첫 번째 읽기를 포함 작동 방법에 대한 설명입니다,의 그것이 무엇을 분석 할 수 있습니다. anrede는 1에서 시작합니다. 파일이 데이터로 가득 차 있다고 가정하고, 우리는 끝 부분에 있지 않으므로 루프를 입력합니다.

anrede == 1인지 확인하면 inhalt_anrede (비어 있음) 값을 Anrede에 복사합니다. 이제 Anrede는 비어 있고 올바르게 끝나는 문자열입니다. 그런 다음 엔 드를 증가시킵니다. 아직 파일에서 아무것도 읽지 않았으므로 eof에 도달하지 못했기 때문에 루프를 시작합니다.

다시 한번 anrede == 1인지 확인합니다. 그렇지 않으면 else 부분을 실행하여 파일에서 한 줄을 가져 와서 inhalt_anrede에 저장합니다. anrede를 다시 늘리십시오. 아직 eof에 도달하지 않았다고 가정 해 봅시다. 다시 루프를 입력하십시오.

위의 단락을 계속 반복하면서 파일을 한 행씩 읽고 eof에 도달 할 때까지 결과를 삭제하면 루프가 끝납니다. 나머지 for 루프는 모두 eof에 도달하지 않았 음을 요구합니다. 그러나 우리는 eof에 도달했기 때문에 이러한 루프는 건너 뜁니다.

기본 생성자를 정의하지 않았으므로 모든 멤버가 초기화되지 않은 채로 남아 있기 때문에 임의의 숫자와 문자가 표시됩니다.

수정

내가 할 첫 번째 일이 내 인생을 간단하게하기 때문에, 수 std :: 문자열을 클래스에 그 문자 배열을 변경합니다. 클래스에서 ifstream을 제거하고 거기에있을 이유가 없으면 필요할 때 생성합니다.

void Kunde::laden(){ 
    string temp; 

    system("cls"); 
    cout << "wie ist ihr nachname?" << endl; 
    cin >> nname; 

    ifstream user1(nname); 

    if(!user1.is_open()){ 
     cout << "Datei nicht gefunden" << endl; 
     return; 
    } 

    getline(user1,Anrede); 
    getline(user1,vname); 
    getline(user1,nname); 
    getline(user1,temp); 
    echte_kontonummer = atol(temp.c_str()); 
    getline(user1,temp); 
    echte_pin = atoi(temp.c_str()); 
    getline(user1, temp); 
    Guthaben = atoi(temp.c_str()); 

    cout << "Daten erfolgreich geladen." << endl; 
    cout << vname << " " << nname << " " << echte_kontonummer << " " << echte_pin << " " << Guthaben << endl; 
} 

파일이 기능은 또한 가정합니다 : 이제 기능을 위해, 당신의 파일이 배치 정확히 방법을 모르는이이 같은 사용자가 제공 한 내용을 기반으로 추측하지만, 뭔가있다 오류를 검사하지 않습니다.당신이 숫자 변환이 유효한지 확인하려면

if (!getline(user1,Anrede)) { 
    // handle error somehow 
} 

, 당신은 새로운 C++ 11 기능 같은 것을 사용하는 것이 좋습니다 : 당신이 원하는 경우에, 당신은 각각의 getline, 예를 들면의 반환 값을 확인할 수 있습니다 , stoi,stoll,etc..., 오류시 예외가 발생합니다.

istringstream iss(temp); 
if (!(iss >> echte_kontonummer)) { 
    // handle error somehow 
} 

을 아니면 문자열을 사용 boost lexical_cast은, 내부적으로 스트림을 사용할 수 있으며, 오류에 예외를 던질 것이다 : 사람들이 사용할 수없는 경우도이 같은 확인할 수 있습니다 문자열 스트림이있다.

+0

+1 코드를 입력하십시오! – AJG85

+0

UR 노력에 감사드립니다.하지만 어떻게 할 수 있습니까? 나는 어리석은 질문을 알고 어쩌면 나는 이것을 이미 알고 있지만 ... – globus243

+0

@ globus243'getline'을 올바르게 사용한다. 힌트 : 오직 하나의 루프 만 필요합니다. – AJG85

관련 문제