【问题标题】:Why does this class freeze the program?为什么这个类会冻结程序?
【发布时间】:2011-11-13 18:25:00
【问题描述】:

这个类应该从数据中读取一些行,并从它们中读取我可以在进一步操作中使用的变量。但由于某种原因,如果它检测到数据并尝试加载它,它就会冻结。为什么? 我看不到我的错误希望你能帮助我。

顺便说一句:课堂上使用的奇怪语言是德语^^希望这没关系。

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

希望你能帮助我。

【问题讨论】:

  • 请不要使用 !user1.eof();在 for :(,我也不认为你需要那么多循环

标签: c++ class freeze void


【解决方案1】:

我在你的循环中看到的是,如果你不在你想去的那一行,你就不会读任何一行。但是由于您没有阅读任何行,因此您将无法进一步阅读要阅读的行。这不仅会阻止您到达您实际想要阅读的行,而且还会阻止您在可接受的时间内到达 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;
         }
}

还要注意,变量Guthabenguthaben 很容易混淆(如果还没有的话),这是非常糟糕的风格。我建议您将guthaben 重命名为zeile,因为它定义了您要阅读的行。

【讨论】:

  • 谢谢你,我真的不明白为什么,但它的工作原理!谢谢哦,因为大写和小写。如果我有 20.000 个不同的变量,我会感到更加困惑。但我认为每个人都有自己的风格
  • @globus243:如果您在示例中的第 6 行,您只会读取一行。但是因为您可能想在必须读取缓冲区之前丢弃这些行。更糟糕的是,您的文件中可能有不止一行,这将导致(几乎)无限循环,因为您只会在guthaben == 6 时读取,因此您不会继续到文件末尾。
  • @globus243:添加了另一个示例,因为我认为我之前提出的建议不会与您的完整代码一起使用,除非您在每次循环后倒回流。
【解决方案2】:

如果guthaben6,你只会读取一行 - 否则你会无限旋转(直到eof - 可能不是这种情况)。对于guthaben 的所有其他值,您不会从user1 流中消费 - 那么您希望如何点击eof

【讨论】:

    【解决方案3】:

    您的代码是 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; }
        ...
    }
    

    【讨论】:

      猜你喜欢
      • 2012-01-12
      • 2020-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-26
      • 1970-01-01
      • 2022-01-16
      • 2016-01-24
      相关资源
      最近更新 更多