2

我写了以下测试代码:

int main(int argc, char* argv[]) {
    stringstream ss;
    int num;

    ss << "54321";
    ss >> num;
    ss.str("");
    ss << "12345";
    ss >> num;

    fprintf(stderr, "%d\n", num);
}

令我惊讶的是,结果是 54321。如何使用提取运算符 (>>) 正确覆盖变量?

4

2 回答 2

8

第一次提取后,您到达了流的末尾,因此eofbit设置和第二次提取失败。

int main(int argc, char* argv[]) {
    stringstream ss;
    int num;

    ss << "54321";
    ss >> num;

    // eofbit was set above,
    // we need to clear it
    ss.clear();

    ss.str("");
    ss << "12345";
    ss >> num;

    fprintf(stderr, "%d\n", num);
}

clear()在尝试第二次提取之前调用成员函数。第二个问题是内部 get 指针的位置,它不会自动重置。用来seekg()设置。

编辑:被击中的东西不是必需的,在这里解释。

于 2012-10-16T15:54:15.427 回答
4

当流到达流的末尾时,std::ios_base::eofbit被设置。在尝试提取任何日期之前,提取会检查是否设置了任何状态标志,如果是,则它不执行任何操作并且您的提取失败:

std::stringstream ss;
ss << "54321";
ss >> num; // sets eof:
std::cout << "eof: " << ss.eof() << "\n";

一旦设置了任何状态标志,要让流执行任何操作,您需要首先清除标志:

ss.clear();
ss << "12345";
if (ss >> num) {
    std::cout << "num=" << num << "\n";
}
else {
    std::cout << "failed to extract a value\n";
}

就个人而言,我一般不使用输出运算符来设置字符串流的内容。相反,我通常使用该str()成员:

std::ostringstream out; // note: this is just an output string stream
...
out.clear();            // the clear is still needed
out.str("12345");
于 2012-10-16T16:01:17.573 回答