C++ Ifstream无限循环(似乎从未找到停止读取的标记)

C++ Ifstream无限循环(似乎从未找到停止读取的标记),c++,loops,infinite-loop,ifstream,peek,C++,Loops,Infinite Loop,Ifstream,Peek,一个相当快的问题。。。我不明白为什么这个循环永远不会结束 #include <iostream> #include <fstream> using namespace std; int main() { //[city1][city2][distance] ifstream sourcefile; int data[50][50]; sourcefile.open("a5.txt"); if(!sourcefile) { cout <&

一个相当快的问题。。。我不明白为什么这个循环永远不会结束

#include <iostream>
#include <fstream>

using namespace std;

int main()
{
 //[city1][city2][distance]

 ifstream sourcefile;

 int data[50][50];



 sourcefile.open("a5.txt");
 if(!sourcefile)
 {
  cout << "file not found" << endl;
  return 1;
 }

 int temp1, temp2, temp3, check;

 char reader;

 check = 0;



 while(reader != 'Q')
 {
  sourcefile >> temp1;
  sourcefile >> temp2;
  sourcefile >> temp3;

  data[temp1][temp2] = temp3;

  cout << "data[" << temp1 << "][" << temp2 << "] = " << temp3 << endl;
  check++;

  if(check > 100)
  {
   cout << "overflow" << endl;
   return 1;
  }

  reader = sourcefile.peek();


 }



 return 0;
}
输出:

data[1][2] = 10
data[1][4] = 30
data[1][5] = 99
data[2][3] = 50
data[2][1] = 70
data[3][5] = 10
data[3][1] = 50
data[4][3] = 20
data[4][5] = 60
data[5][2] = 40
data[0][2] = 40
data[0][2] = 40

...
... (repeats "data[0][2] = 40" about 60 more times)
overflow

这是peek获得failbit字符的情况吗?

peek让您看到下一个字符,我认为在本例中是距离值后的换行符。因为它不是Q,所以循环尝试读取另外三个整数值,失败并设置错误位。peek,当出现故障时,返回EOF-因此您永远看不到Q。

在开始读取文件之前,请尝试以下操作

sourcefile >> std::skipws;

它将导致忽略诸如换行符之类的空白。

add
sourcefile>>ws在偷看之前。(包括)事实上,我一定是忘了打save了,你的建议奏效了!啊。。。我想这可能就是问题所在。我不确定peek是否跳过了空白,这没有任何效果,它仍然不断重复
sourcefile >> std::skipws;