C++ 这门课为什么要冻结这个程序?
这个类应该从数据中读取一些行,并从中读取变量,以便在进一步的操作中使用。但由于某种原因,如果它检测到数据并尝试加载它,它就会冻结。为什么? 我看不出我的错误,希望你能帮助我 顺便说一句:课堂上使用的奇怪语言是德语^^^希望这没关系C++ 这门课为什么要冻结这个程序?,c++,class,freeze,void,C++,Class,Freeze,Void,这个类应该从数据中读取一些行,并从中读取变量,以便在进一步的操作中使用。但由于某种原因,如果它检测到数据并尝试加载它,它就会冻结。为什么? 我看不出我的错误,希望你能帮助我 顺便说一句:课堂上使用的奇怪语言是德语^^^希望这没关系 void Kunde::laden(){ string inhalt_anrede, inhalt_vname, inhalt_nname, inhalt_knummer, inhalt_pin, inhalt_guthaben; in
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();
}
希望你能帮助我。如果guthaben是6,你只会读一行,否则你会无限期地旋转直到eof,这可能不是事实。对于guthaben的所有其他值,您没有从流user1消费-那么您希望如何达到eof?如果guthaben为6,您只读取一行-否则您将无限旋转直到eof-可能不是这样。对于guthaben的所有其他值,您没有从流user1中消费-那么您希望如何达到eof?我在您的循环中看到的是,如果您不在您想要的行,那么您不会读取任何行。但是,由于你不读任何一行,你将无法进一步了解你想读的那一行。这不仅会阻止你到达你真正想读的那一行,而且会阻止你在你可以接受的时间内到达eof,在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,因为它定义了您要阅读的行。我在您的循环中看到的是,如果您不在您要阅读的行上,您就不会阅读任何行。但是,由于你不读任何一行,你将无法进一步了解你想读的那一行。这不仅会阻止你到达你真正想读的那一行,而且会阻止你在你可以接受的时间内到达eof,在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是一种非常糟糕的风格,如果它们还没有出现,那么很容易混淆。我建议你把古萨班改名为蔡尔,因为它定义了你想读哪一行。 你的代码是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; }
...
}
<>你的代码是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; }
...
}
请不要使用!user1.eof;另外,我认为你不需要那么多的环路,请不要使用!user1.eof;我也不认为你需要那么多的回路谢谢,我真的不明白为什么,但它是有效的!谢谢哦,因为是大写和小写。如果我有20000个不同的变量,我会觉得更混乱。但我认为每个人都有自己的想法style@globus243:仅当您在示例中的第6行时才读取一行。但是,您可能想在必须从缓冲区中读取行之前丢弃这些行。更糟糕的是,您的文件中可能有多行,这将导致几乎无休止的循环,因为当guthaben==6时,您将只读,因此您不会继续到文件的结尾。@globus243:添加了另一个示例,因为我认为我之前提出的建议不会与完整代码一起工作,除非您在每次之后倒带流谢谢你,我真的不明白为什么,但它的工作!谢谢哦,因为是大写和小写。如果我有20000个不同的变量,我会觉得更混乱。但我认为每个人都有自己的想法style@globus243:仅当您在示例中的第6行时才读取一行。但是,您可能想在必须从缓冲区中读取行之前丢弃这些行。更糟糕的是,您的文件中可能有多行,这将导致一个几乎无止境的循环,因为当guthaben==6时您将只读,因此您不会继续到文件的结尾。@globus243:添加了另一个示例,因为我认为我之前提出的建议不会与完整代码一起工作,除非您在每次循环后倒带流。
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; }
...
}