如何在'while(getline(...))'循环中将'string line'与'getline(in,line)'在同一范围内?

时间:2011-06-06 01:53:13

标签: c++ scope while-loop getline

示例:

std::ifstream in("some_file.txt");
std::string line; // must be outside ?
while(getline(in,line)){
  // how to make 'line' only available inside of 'while' ?
}

Do-while循环不适用于第一次迭代:

std::ifstream in("some_fule.txt");

do{
  std::string line;
  // line will be empty on first iteration
}while(getline(in,line));

当然,总有if(line.empty()) getline(...),但感觉不对。 我还想过滥用逗号运算符:

while(string line, getline(in,line)){
}

但这不起作用,MSVC告诉我,因为line无法转换为bool。通常,以下序列

statement-1, statement-2, statement-3

应为type-of statement-3类型(不考虑重载operator,)。我不明白为什么那个不起作用。有什么想法吗?

3 个答案:

答案 0 :(得分:6)

你可能会作弊,只是制造一个多余的块:

{
    std::string line;
    while (getline(in, line)) {
    }
}

这在技术上并不是“相同的范围”,但只要外部区块中没有其他东西,它就等同。

答案 1 :(得分:3)

for循环可以工作,我一直这样做:

for (std::string line;
     getline(in,line); )
{
}

答案 2 :(得分:2)

您可以使用for循环:

for(std::string line; getline(in, line);) {

}
但是,我不认为这是非常好的风格。