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

How to have the 'string line' in the same scope as the 'getline(in,line)' in a 'while(getline(...))' loop?

本文关键字:getline line in 于同一 范围内 循环 while string      更新时间:2023-10-16

示例:

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,)。我不明白为什么那个不起作用。有什么想法吗?

你可以作弊一点,只做一个多余的块:

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

从技术上讲,这不是"相同的范围",但只要外部块中没有其他内容,它就是等效的。

for循环会起作用,我一直这样做:

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

您可以使用for循环:

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

不过,我认为这不是一个很好的风格。