我注意到在.rdbuf()上使用ifstream似乎可以对其进行某种更改。以下代码应显示该问题。

#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;
}

之所以困扰我,是因为我目前正在尝试使用ofstream ofs; ofs << ifs.rdbuf()将一个文本文件的内容复制到另一个文本文件中。这可以正常工作,但是使用ifs读取getline(ifs, str)失败,从而有效地“破坏”了流。

最佳答案

这不是特别“怪异”;这与您每天看到的流行为相同。 rdbufstd::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;

由于您的流是文件流,因此可以从头开始查找它(从本质上说,它对其基础缓冲区也是如此)。

关于c++ - ifstreams和rdbuf()的怪异行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38808200/

10-16 04:46