3

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

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”。和建议?

4

3 回答 3

3

会发生以下情况:一旦您的程序到达这一行,

while(stream>>n){}

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

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

while (getline(stream, temp)){

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

这就是您的程序提前结束的原因。但是,它甚至不应该 print a1。事实上,它只a在我的机器上打印。

在循环内吃完整数标记后,您需要清除失败状态。在末尾添加以下语句:

stream.clear();

这将重置失败状态 ( stream.fail() == false) 并且外部循环将继续运行。

于 2013-03-14T22:54:35.460 回答
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]); })
于 2013-03-14T22:37:39.120 回答
0

如果字符串不为空,并且以字母开头,对吗?

if (temp.size() > 0 && isalpha(temp[0]))
{
    cout << temp;
}
于 2013-03-14T22:47:36.680 回答