Почему этот класс останавливает программу?
Этот класс должен читать некоторые строки из данных и из них в переменные, которые я могу использовать в дальнейших операциях. но по какой-то причине он зависает, если обнаружил данные и попытался их загрузить. Зачем? Я не вижу своей ошибки, надеюсь, ты сможешь мне помочь.
Кстати: странный язык, который используется в классе, немецкий ^^ надеюсь, это не имеет значения.
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; }
...
}