1

我正在重载我的 istream 运算符,所以我可以std::cin用我的对象替换。我知道我必须为它提供一个空的字符串流才能使最终输出正常工作。

我想像这样std::ifstream输入一个std::stringstream

while(ifs >> ss) {}

这可能吗?这是一个示例原型代码:

friend istream & operator >> (istream & is, Database & db)
{
    ifstream ifs;
    ifs.open(db.inputFilename_, ios::in | ios::binary);
    if (!ifs.is_open())
    {
        cout << "Couldn't read " << db.inputFilename_ << endl;
        return is;
    }
    while (ifs >> db.iss)
    {}
    ifs.close()
    return db.iss;
}

我对任何以“使用 Boost”开头的答案都不感兴趣 :) 这是一个纯粹的标准 C++ 项目。感谢您的任何帮助或指点。

现在我得到:

error: invalid operands to binary expression ('ifstream' (aka 'basic_ifstream<char>') and 'istringstream' (aka 'basic_istringstream<char>'))
4

2 回答 2

3

只需这样做:

 if(ifs){
     db.iss << ifs.rdbuf();    
     ifs.close();
 }
于 2014-12-13T21:56:17.617 回答
1

您可以std::copy使用std::istream_iteratorforstd::cinstd::ostream_iteratorfor std::stringstream

#include <algorithm>
#include <fstream>
#include <iomanip>
#include <iostream>
#include <iterator>
#include <sstream>

void redirect(std::ifstream &is, std::stringstream &os) {
    is >> std::noskipws;
    std::istream_iterator<char> begin(is);
    std::istream_iterator<char> end;
    std::ostream_iterator<char> out(os);
    std::copy(begin, end, out);
}

请注意,这会将整个文件复制到 中std::stringstream,因此对于无法放入内存的非常大的文件,这将失败。NaCl 给出的rdbuf解决方案同样会遇到非常大的文件的问题。

您可以通过不一次读取所有输入来解决大文件问题。但是,这很可能需要您在解析器中重构代码。如果没有有关其实现的更多详细信息,我无法为您指明正确的方向。

于 2014-12-13T21:54:52.320 回答