2011-03-29 53 views
2

我有这样的文字样本阅读文本文件中的一行两次

Ahmed 10 
kmal 5 
doola 6 

,我使用此代码阅读

if (myfile.is_open()) 
{ 
    while (myfile.good()) 
{ 

    myfile >> name; 
    myfile >> phone; 
    cout << name <<" "<<phone<<endl; 

} 
myfile.close(); 

}

我得到这个输出

Ahmed 10 
kmal 5 
doola 6 
doola 6 

此代码为何读取最后一行是两次?

+0

尝试'while(myfile.good()&&!myfile.eof())'。 – 2011-03-29 01:32:44

+1

看到如何正确使用流标志:http://stackoverflow.com/questions/4258887/semantics-of-flags-on-basic-ios – GManNickG 2011-03-29 01:41:46

回答

2

尝试

while(myfile >> name >> phone) { 
    // your code here 
} 

我相信另一种方法的问题是,除非你真的尝试阅读比你应该更多的东西,否则不会发出eof信号。也就是说,当你在上一轮尝试myfile >> name时。那就失败了,就像myfile >> phone一样,只有这样才能摆脱循环。

+0

这工作正常。 TY – Ahmed 2011-03-29 01:40:42

1

请勿使用while(myfile.good())。它仍然会说true,即使您已经读取了文件中的最后一行。然后下一个>>将会失败,从而使namephone变量与最后一个输入保持不变。改为:while(myfile >> name >> phone) {...}

+1

同样的问题.... – Ahmed 2011-03-29 01:34:29

+0

@艾哈迈德:谢,我忘了同样的问题问题存在'eof()',抱歉。 :)尝试新版本。 – Xeo 2011-03-29 01:39:32

6

myfile.good()在读取失败后变为false。与myfile.eof()相同。

你想要什么基本上是:

myfile >> name; 
myfile >> phone; 
if (!myfile.good()) break; 

这样就可以缩短为:

if (!(myfile >> name >> phone)) break; 

或最后:

while (myfile >> name >> phone) { ... } 
1

iostream状态不是预测性的。它报告前一个操作的结果 ,而不是下一个(无论如何都不可能实现 )。 myfile.good()甚至没有可靠的指标 以前的操作结果:如果操作失败,那么 将为false,但如果操作成功,则不一定为 为真。忘记那个功能。

使用流可以充当布尔值的事实来测试 先前操作的成功。一旦你失败了,你可以使用eof(), 和bad()来确定为什么(但是关于eof(),仅在 失败之后--- eof()可能返回true,即使之前的操作 成功)。因此:

while (myfile >> name >> phone) { 
    // ... 
} 
if (myfile.bad()) { 
    std::cerr << "Hardware read error" << std::endl; 
} else if (!myfile.eof()) { 
    std::cerr << "Format error in file" << std::endl; 
}