迭代文件失败

时间:2013-03-14 22:17:41

标签: c++

我想遍历文件并打印所有字符串。例如,该文件包含:

a
1
2
10
a1
1
b

将输出:

a
a1
b

我写这样的代码:

int main(){
  ifstream stream;
  stream.open("example.txt");
  string temp;
  while (getline(stream, temp)){
    cout<<temp<<endl;
    int n;
    while(stream>>n){}
  }
}

此程序在线打印“a”和“a1”。和建议?

3 个答案:

答案 0 :(得分:3)

以下情况如下:一旦你的程序到达这一行,

while(stream>>n){}

它尝试从文件中读取以下标记int egers。 1成功。 2成功。 10成功。 a1失败。

stream现在处于失败状态(stream.fail() == true)。代码执行的下一个语句是

while (getline(stream, temp)){

读取下一个标记(a1),但由于stream处于失败状态,getline的结果将被解释为{{ 1}},循环将被中断。

这就是你的课程过早结束的原因。但是,它甚至不应该打印false。实际上,它只在我的机器上打印a1

在循环中吃掉整数标记后,需要清除失败状态。最后添加以下语句:

a

这会重置失败状态(stream.clear(); ),外循环将继续运行。

答案 1 :(得分:1)

这个怎么样?

std::copy_if(std::istream_iterator<string>(stream), std::istream_iterator<string>(),
             std::ostream_iterator<string>(std::cout),
             [](std::string const& rhs) { return !std::isdigit(rhs[0]); })

答案 2 :(得分:0)

如果string不为空,并以字母开头,对吗?

if (temp.size() > 0 && isalpha(temp[0]))
{
    cout << temp;
}