首页 文章

C将ifstream用于stringstream

提问于
浏览
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>'))

2 回答

  • 1

    只需这样做:

    if(ifs){
         db.iss << ifs.rdbuf();    
         ifs.close();
     }
    
  • 2

    您可以将std::copystd::istream_iterator用于 std::cin ,将std::ostream_iterator用于 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 解决方案同样会对非常大的文件产生问题 .

    您可以通过不立即读取所有输入来解决大文件问题 . 但是,这很可能需要您在解析器中重构代码 . 如果没有更详细的实现,我不能指出你正确的方向 .

相关问题