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; }
    ...
}