Почему этот класс останавливает программу?

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

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

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 ответа

Решение

Что я вижу в вашем цикле, так это то, что вы не читаете ни одной строки, если не находитесь на той строке, на которой хотите быть. Но так как вы не читаете ни одной строки, вы не получите дальше той строки, которую хотите прочитать. Это не только мешает вам достичь той строки, которую вы на самом деле хотите прочитать, но и не достигает 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 потому что он определяет, на какой строке вы хотите прочитать.

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

Ваш код представляет собой смесь 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; }
    ...
}
Другие вопросы по тегам