C++ ifstreams和rdbuf()的奇怪行为

C++ ifstreams和rdbuf()的奇怪行为,c++,c++11,fstream,ifstream,C++,C++11,Fstream,Ifstream,我注意到在ifstream上使用.rdbuf()似乎会以某种方式改变它。下面的代码应该会显示问题 #include <fstream> #include <iostream> using namespace std; int main(int argc, const char * argv[]) { ifstream ifs("Sample.csv"); cout << "Reading buffer: " << endl;

我注意到在
ifstream
上使用
.rdbuf()
似乎会以某种方式改变它。下面的代码应该会显示问题

#include <fstream>
#include <iostream>

using namespace std;

int main(int argc, const char * argv[]) {
    ifstream ifs("Sample.csv");
    cout << "Reading buffer: " << endl;
    cout << ifs.rdbuf(); // Outputs buffer as expected
    cout << "Reading buffer again: " << endl;
    cout << ifs.rdbuf(); // Returns nothing

    return 0;
}
#包括
#包括
使用名称空间std;
int main(int argc,const char*argv[]{
ifstream ifs(“Sample.csv”);
cout
ifs.rdbuf()
返回指向
ifs
对应的流缓冲区对象的指针。通过
将其发送到
std::cout
,这并不是特别“奇怪”;这与您每天看到的流行为相同。
rdbuf
std::stringstream::str()不同
这不是魔法-它是指向缓冲区的指针,您的
cout
正在读取缓冲区,就像您自己从原始流读取一样:

std::stringstream ss("1");
int x;
if (ss >> x)
   cout << x;
if (ss >> x)   // doesn't work a second time; "1" is already extracted
   cout << x;
std::stringstream ss(“1”);
int x;
如果(ss>>x)
cout>x)//第二次不起作用;“1”已被提取

问题出在哪里?您已经从一个文件中读取了所有内容,为什么还需要读取一些内容?您需要倒带该文件,因为您已通过调用使用了流:insert
ifs.seekg(0)下面是回答部分:@ PopyFig不会灰心。你可能会惊讶地发现,许多经常使用C++的工程师不知道如何像<代码> RDBuf()那样的事情。
实际上是有效的。大多数人并不需要知道他们的日常使用情况,但一旦你开始潜水,这真的是一个有趣的旅程。拍拍自己的背,感谢自己花时间游离海岸稍远一点。@pupyDog根据标准(),
操作符注:只需调用
ifs.rdbuf()
不会推进搜索位置。它只是返回一个指向与流相关联的流缓冲区对象的指针。重要的是之后如何处理该指针。在这种情况下,您将通过
操作符将其发送到
std::cout
。我很想对此进行投票,但谁是对的-目前不准确。Co用OP非常熟悉的东西来改变同样的行为;干得好,先生。