2011-09-09 53 views
1

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

btw:在课堂上使用的奇怪语言是德语^^希望这并不重要。

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(); 
    } 

我将解释一个循环的structer用一个例子

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

希望你能帮助我。

+0

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

回答

2

我在你的循环中看到的是,如果你不在你想要的位置,你不会读取任何行。但是因为你没有阅读任何一行,你不会进一步阅读你想阅读的文章。这不仅会阻止您达到您实际想要阅读的行数,而且还会在可接受的时间内达到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,因为它定义了你想要读的行。

+0

谢谢ui不要真正理解为什么,但它的工作!谢谢哦,因为大写和小写,我觉得更令人困惑,如果我有20.000不同的变量。但我认为每个人都有自己的风格 – globus243

+0

@ globus243:如果你在例子的第6行你只读了一行,但是你可能想在你读取缓冲区之前丢弃这些行,更糟的是你可能有在你的文件中多出一行会导致(几乎)无限循环,因为只有当'guthaben == 6'时你才会读取,所以你不会继续到文件末尾。 – Nobody

+0

@ globus243:我认为增加了另一个例子我之前提出的建议将不会与您的完整代码一起工作,除非您在每个循环之后回滚流。 – Nobody

2

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

1

你的代码是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; } 
    ... 
} 
+1

建议'switch()';) – Nobody

+0

@无人:我同意100% –

相关问题