【问题标题】:C++ Piping ifstream into stringstreamC ++将ifstream管道传输到stringstream
【发布时间】:2014-12-13 21:47:47
【问题描述】:

我正在重载我的 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>'))

【问题讨论】:

  • 让我为你改述一下;)
  • 你为什么有一个 stringstream 成员,这应该做什么?

标签: c++ file ifstream stringstream istringstream


【解决方案1】:

只需这样做:

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

【讨论】:

  • 如果输入文件很大,会怎样?
  • 您的新示例不适用于 istringstream,但适用于普通 stringstream。我现在正在测试它。顺便说一句,谢谢!
  • 哦,是的,很抱歉。就用这个吧,比std::copy快一点。
  • 完美运行,而且真的快!再次感谢您的宝贵时间,非常感谢。
  • 我总是这样做:c++ 标准(平台无关)> 优雅> 速度。以我的个人项目为例。幸运的是你发布的内容也很快:)
【解决方案2】:

您可以将std::copystd::istream_iterator 一起用于std::cinstd::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 解决方案同样会在处理非常大的文件时出现问题。

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

【讨论】:

  • 我不确定我明白你的意思。基本上不要重载 istream 运算符?
  • 我可以在使用全键盘后发布一个完整的示例。
  • 请做!我有几个备用键盘,要我邮寄一个吗? :D
  • std::copy(std::istreambuf_iterator&lt;char&gt;(ifs), std::istreambuf_iterator&lt;char&gt;(), std::ostreambuf_iterator&lt;char&gt;(db.iss));
  • 你不需要超载任何东西。
猜你喜欢
  • 2012-03-19
  • 1970-01-01
  • 2018-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多