Почему этот класс останавливает программу? - PullRequest
1 голос
/ 09 сентября 2011

Этот класс должен читать некоторые строки из данных и из них в переменные, которые я могу использовать в дальнейших операциях. но по какой-то причине он зависает, если обнаружил данные и попытался их загрузить. Зачем? Я не вижу своей ошибки, надеюсь, ты сможешь мне помочь.

Кстати: странный язык, который используется в классе - немецкий ^^ надеюсь, это не имеет значения.

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 ( int anrede=0;!user1.eof();anrede++){
             if (anrede==1){
                 getline(user1, inhalt_anrede);       
                 strcpy(Anrede,inhalt_anrede.c_str());
             }
         }
         for ( int vorname=0;!user1.eof();vorname++){
             if (vorname==2){
                 strcpy(vname,inhalt_vname.c_str());
             }
         }
         for ( int nachname=0;!user1.eof();nachname++){
             if (nachname==3){
                 getline(user1, inhalt_nname);       
                 strcpy(nname,inhalt_nname.c_str());
             }
         }
         for ( int knummer=0;!user1.eof();knummer++){
             if (knummer==4){
                 getline(user1, inhalt_knummer);       
                 echte_kontonummer=atol(inhalt_knummer.c_str());
             }
         }
         for ( int pin=0;!user1.eof();pin++){
             if (pin==5){
                 getline(user1, inhalt_pin);       
                 echte_pin=atoi(inhalt_pin.c_str());
             }
         }
         for ( int guthaben=0;!user1.eof();guthaben++){
             if (guthaben==6){
                 getline(user1, inhalt_guthaben);       
                 Guthaben=atoi(inhalt_guthaben.c_str());
             }
         }
         cout << "Daten erfolgreich geladen." << endl;

         }
         user1.close();
    }

Я объясню структуру одной петли на примере

     for ( int guthaben=0;!user1.eof();guthaben++){ //i think this is understandable
         if (guthaben==6){ //in this case the desired value is on line 6
             getline(user1, inhalt_guthaben);       
             Guthaben=atoi(inhalt_guthaben.c_str()); //from string to int to the desired value Guthaben.
         }
     }

надеюсь, ты сможешь мне помочь.

Ответы [ 3 ]

2 голосов
/ 09 сентября 2011

Что я вижу в вашем цикле, так это то, что вы не читаете ни одной строки, если не находитесь на той строке, на которой хотите быть.Но так как вы не читаете ни одной строки, вы не получите дальше той строки, которую хотите прочитать.Это не только мешает вам достичь строки, которую вы на самом деле хотите прочитать, но и не достигает eof в приемлемое время (вы будете после переполнения guthaben столько раз, сколько строк в вашем файле).Итак, что вам нужно сделать, это прочитать строку при любых обстоятельствах и отбросить значение, если оно вам не нужно.Попробуйте:

for ( int guthaben=0;!user1.eof();guthaben++){ //i think this is understandable
         if (guthaben==6){ //in this case the desired value is on line 6
             getline(user1, inhalt_guthaben);       
             Guthaben=atoi(inhalt_guthaben.c_str()); //from string to int to the desired value Guthaben.
         }else
             getline(user1, inhalt_guthaben);
     }

или

for ( int guthaben=0;!user1.eof();guthaben++){ //i think this is understandable
             getline(user1, inhalt_guthaben);       
        if (guthaben==6){ //in this case the desired value is on line 6
             Guthaben=atoi(inhalt_guthaben.c_str()); //from string to int to the desired value Guthaben.
          }
     }

Обратите внимание, что это приведет к проблемам с вашим текущим стилем чтения.было бы лучше иметь все в одном цикле, как предлагал e.James:

for ( int zeile=1;!user1.eof();zeile++){//Natural counting (beginning at 1)!
    std::string inhalt;
    getline(user1, inhalt);
    switch(zeile){
             case 1:
                strcpy(Anrede,inhalt.c_str());
             break;
             case 2:
                 strcpy(vname,inhalt.c_str());
             break;
             case 3:
                 strcpy(nname,inhalt.c_str());
             break;
             case 4:
                 echte_kontonummer=atol(inhalt.c_str());
             break;
             case 5:
                 echte_pin=atoi(inhalt.c_str());
             break;
             case 6:
                 Guthaben=atoi(inhalt.c_str());
             break;
         }
}

Также обратите внимание, что очень плохо иметь переменные Guthaben и guthaben, которые можно легко перепутать(если они еще не).Я бы посоветовал вам переименовать guthaben в zeile, поскольку он определяет, на какой строке вы хотите прочитать.

2 голосов
/ 09 сентября 2011

Вы читаете строку, только если guthaben равно 6 - иначе вы вращаетесь бесконечно (до eof - что может быть не так).Для всех других значений guthaben вы не потребляете из потока user1 - так как вы ожидаете, что вы нажмете eof?

1 голос
/ 09 сентября 2011

Ваш код представляет собой смесь C и C ++, но это не является (обязательно) проблемой. Основная проблема заключается в способе обработки цикла ввода файлов. В дополнение к уже опубликованным ответам, здесь есть цикл C ++, который должен делать то, что вы хотите:

std::string anrede;
std::string vorname;
...
for (int line_number=0; input_file.good(); line_number++){
    getline(input_file, input_line);
    if (line_number==1) { anrede = input_line; }
    if (line_number==2) { vorname = input_line; }
    ...
}
...