C++ 添加额外字符时,stringstream的回拨失败

C++ 添加额外字符时,stringstream的回拨失败,c++,stringstream,istream,C++,Stringstream,Istream,我有下面的代码片段来修改stringstream,使它在前面有一个额外的字符。但是,我没有得到预期的结果 void modifyStream(std::istream& s1) { if (s1.putback('Y')) std::cout << s1.rdbuf() << '\n'; else std::cout << "putback failed\n"; } int main(int argc, c

我有下面的代码片段来修改stringstream,使它在前面有一个额外的字符。但是,我没有得到预期的结果

void modifyStream(std::istream& s1)
{
    if (s1.putback('Y'))
       std::cout << s1.rdbuf() << '\n';
    else
       std::cout << "putback failed\n";
}

int main(int argc, const char * argv[])
{

  const char* str = "Hello, world";
  std::stringstream s1(str); // IO stream
  modifyStream(s1);

  return 0;
}
void modifyStream(std::istream&s1)
{
如果(s1.回拨('Y'))

std::cout对代码中的方法有一个误解:它的目的不是在流中预先添加数据,而是用另一个字符替换一个已提取的字符(您不添加任何内容,而是用新字符替换旧字符)通过阅读
putback
调用的文档,这更容易理解

示例(来自):


调用
s1.putback('Y')
将字符
'Y'
放回上次提取字符的位置(在本例中为
'H'
)。

函数putback不返回布尔值,而是返回指针。但是,您可以将调用封装在try-catch块中,并查找异常“failure”它将抛出。@zoubida13不,
putback
不返回指针。它返回对输入流的引用,该引用可转换为布尔值。封装在try-catch中不会做任何事情,除非调用抛出一些在这里没有观察到的东西。我没有说它会解决问题,否则我会发布一个answer、 我只是对隐式强制转换的使用进行了评论,当您可以有一个很好的异常来告诉您它失败的原因时。仅供参考,您所称的对输入流的引用实际上是一个指针。是的,这是正确的!。但我注意到putback()当数据流是istream对象时,能够将数据预处理到流中。但当涉及到stringstream时,它会失败。是否有其他方法将stringstream强制转换到istream中,以便它可以将数据预处理到流中?@Karthick我真的不明白-你能展示与
istream
一起工作的代码吗?我对main做了以下更改function.int main(int argc,const char*argv[]){modifyStream(cin);返回0;}创建了一个名为test.txt的文本文件,内容为“Hello,world”。运行程序TestProgram.exeputbackfail
的行为取决于
pbackfail
哪个默认行为(在
streambuf
中)是预加字符(如果不是
eof
),但此行为已被覆盖。如果确实要预先添加到stringstream,则需要创建一个新的stringstream并向其添加任何内容。
std::stringstream s1("Hello, world"); // IO stream
s1.get();
if (s1.putback('Y')) // modifies the buffer
    std::cout << s1.rdbuf() << '\n';
else
    std::cout << "putback failed\n";
Yello, world