sstream 字符串错误输出

sstream string wrong output

我正在尝试使用 sstream 读取一个由三个数字组成的字符串,但是当我尝试打印它们时,我得到一个包含四个数字的错误输出。

代码:

#include <iostream>
#include <sstream>

using namespace std;

int main() {
    string a("1 2 3");

    istringstream my_stream(a);

    int n;

    while(my_stream) {
        my_stream >> n;
        cout << n << "\n";
    }
}

输出:

1
2
3
3

为什么我在输出中得到四个数字,而在输入字符串中得到三个数字?

您正在打印数据,然后再检查读取是否成功。

    while(my_stream) {
        my_stream >> n;

应该是

    while(my_stream >> n) {

相关(似乎不重复,因为此处未使用 eof()):
c++ - Why is iostream::eof inside a loop condition (i.e. while (!stream.eof())) considered wrong? - Stack Overflow

这里

while ( my_stream )
如果没有 I/O 错误,

my_stream 可转换为 bool 和 returns true

参见:https://en.cppreference.com/w/cpp/io/basic_ios/operator_bool

所以,在最后一次读取之后,还没有 I/O 错误,所以它再次迭代并且有一个错误,并且在这个语句中没有读入 n

my_stream >> n;

并且,std::cout 再次打印最后提取的值,即 3。

解决方法可以是读入while后直接检查I/O错误(首选):

while ( my_stream >> n )
{
    std::cout << n << '\n';
}

或者,仅在使用 if:

读取成功时打印
while ( my_stream )
{
    if ( my_stream >> n ) // print if there's no I/O error
    {
        std::cout << n << '\n';
    }
}

示例(live):

#include <iostream>
#include <sstream>

int main()
{
    std::string a { "1 2 3" };

    std::istringstream iss{ a };

    int n {0};

    while ( iss >> n )
    {
        std::cout << n << '\n';
    }

    return 0;
}

输出:

1
2
3

相关:Why is "using namespace std;" considered bad practice?