gpt4 book ai didi

c++ - 在 rdbuf 之后重用 stringstream

转载 作者:太空宇宙 更新时间:2023-11-04 13:44:35 25 4
gpt4 key购买 nike

是否可以在使用 .rdbuf() 函数将缓冲区推送到另一个流 stream 后重用字符串流 s

我重建了环境:

http://ideone.com/JoPJ1E

#include <iostream>
using namespace std;
#include <fstream>
#include <sstream>
#include <assert.h>

ofstream f("t.txt");

void dump(stringstream & s){
f << s.rdbuf();
assert(f.good()); // THIS ASSERT FAILS IN my code (see main)
}

void doit1(){

static std::stringstream s;

s.str("");
s.clear();
s.seekp(0);
s.seekg(0);

s << "1";
dump(s);

}

void doit2(){
// your code goes here
std::stringstream s;
s << "2";
dump(s);

}

int main() {
// your code goes here
doit2();
doit1(); // ASSERT FAILS HERE
}

我的程序没有崩溃,文本文件中也没有输出!断言完全通过调用 doit1() 失败,为什么 doit2 将流 f 设置为错误状态??

知道这里可能出了什么问题吗?

最佳答案

好像是long-standing MSVC design issue通过 Dinkumware(Microsoft 的 STL 提供程序)在与空内容关联的流上使用 seekp 设置 0 位置时。显然他们这样做是为了让编译器符合 Perennial C++ test suite并且标准规定了这一点。

我发现 N3797 不是很清楚,因为 §27.7.3.5 basic_ostream seek members/p3

basic_ostream& seekp(pos_type pos);

3 Effects: If fail() != true, executes

rdbuf()->pubseekpos(pos, ios_base::out). In case of failure, the function calls setstate(failbit) (which may throw ios_base::failure).

4 返回:*this.

并且直接调用pubseekpos(等效)不会触发任何错误。

使用 MSVC2013Update4 测试:

int main() {
std::stringstream s;
s.str("");
if (s.fail())
cout << "bad"; // not printed
s.seekp(0);
// s.rdbuf()->pubseekpos(0, ios_base::out); // Equivalent as per 27.7.3.5/3
if (s.fail())
cout << "bad"; // printed
}

Clanggcc工作得很好。

关于c++ - 在 rdbuf 之后重用 stringstream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26516278/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com