此类应从数据中读取一些行,并从它们中读取一些行,以供我在后续操作中使用。但是由于某种原因,如果检测到数据并尝试加载它,它将冻结。为什么?
我看不到我的错误,希望你能帮助我。
顺便说一句:类里面使用的奇怪语言是德语^^希望这没关系。
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.
}
}
希望你能帮助我。
最佳答案
我在循环中看到的是,如果您不在自己想去的那一行,则不会阅读任何一行。但是,由于您不阅读任何行,因此您将无法进一步进入要阅读的行。这不仅会阻止您到达您实际想要读取的行,而且还无法在可接受的时间内到达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
,因为它定义了您要读取的行。关于c++ - 为什么此类会卡住程序?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7361626/