2015-10-16 59 views
1

我试图从文件中的文本阅读,这是我在做什么:为什么我在文件中读到最后一个字两次?

int main(int argc, char* argv[]) 
{ 

ifstream inFile; 
inFile.open(argv[1]); 

string item; 

while(inFile.good()) 
{ 
    inFile >> item; 
    cout << item << " " << endl; 
} 

出于某种原因,它会读取文件中的最后一个字的两倍。我试着用count变量来跟踪它进入while循环的次数,它总是比文件中的总行数多一倍。我认为这是因为inFile.good()声明不会很快返回false。如果解决它,该怎么办?

+1

你应该添加的文件contet太(如果它不是太长) – Arne

+1

该文件可能是“好”,但接下来的'INFILE >> item'仍然可能会失败,你的输出也无妨。 –

回答

2

你是不是测试,如果

inFile >> item; 

正在取得成功 - 在已经读取文件的最后一个字还是有换行符或其他一些空白点 - 所以你没有达到文件结尾,但另一方面也没有更多的单词需要读取,因此上次读取失败,但是您没有检测到它。

您可以测试>>作为布尔表达式的成功,这应该工作;

if (inFile >> item) 
    cout << item << " " << endl; 
+0

那么我能做些什么来抓住它?我尝试设置'inFile >>项目;'作为参数,但现在它跳过第一行,仍然读取最后一行两次。 –

+0

它会返回一个布尔值true或false,只是测试一个if-statment – Soren

1

上次读取失败,但您没有抓住它。该变量仅保留之前的值。

你的循环更改为:

while(inFile >> item) 
{ 
    cout << item << " " << endl; 
} 
+0

我试过了。现在它跳过第一行并仍然读取最后一行两次。 –

0

其他人表现出你应该写的代码,所以我只是要解释为什么你的代码没有工作。

istream.good(),的确, “没有返回很快假的。”在阅读文件中的最后一项之后,它仍然是真的。当您试图读取文件的结尾之后的一个项目时,它只会变成错误。

全部询问“我已达到文件末尾?”的各种方式?在C和C++中有相同的语义。这是因为底层操作系统原语read无法同时返回数据和EOF信号。

相关问题