我注意到在.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)
失败,从而有效地“破坏”了流。 最佳答案
这不是特别“怪异”;这与您每天看到的流行为相同。 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;
由于您的流是文件流,因此可以从头开始查找它(从本质上说,它对其基础缓冲区也是如此)。
关于c++ - ifstreams和rdbuf()的怪异行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38808200/