【问题标题】:Is it possible to create an ifstream without a real file是否可以在没有真实文件的情况下创建 ifstream
【发布时间】:2020-05-15 03:25:47
【问题描述】:

我正在使用一个第三方库,它需要一个 ifstream 对象作为输入,我有一个 stringstream 对象,其中包含他们需要的一切。现在,我必须将 stringstream 的内容写入文件,然后将 ifstream 对象发送到库。我想知道是否可以在内存中直接将 stringstream 转换为 ifstream,这样我就不需要在磁盘上写入文件?谢谢。

【问题讨论】:

  • 我认为当图书馆坚持使用fstream 而不是接受istream 时,图书馆就坏了。你确定它必须是文件流吗?它是什么图书馆?
  • 函数采用std::ifstream,还是std::istream?前者是糟糕的设计,后者会让你将stringstream 直接传递给函数。
  • 除了对坚持使用std::ifstream 而不是std::istream 的库的质量的担忧之外,可能还有一种解决方法,但我不确定是否会失败。使用派生缓冲区,流的行为可能会改变(例如这里:SO: How to convert QByteArray to std::istream or std::ifstream?),这也可能适用于std::ifstream。我在github: zstr 中找到了派生std::ifstream 的示例。
  • fwiw 我恢复了标签的添加,因为我理解这个问题是关于避免处理文件而不是文件处理

标签: c++ ifstream stringstream


【解决方案1】:

我你的图书馆真的接受 std::ifstream 而不是 std::istream,然后我发现了以下 hack:

#include <fstream>
#include <iostream>
#include <sstream>
#include <string>

void foo(std::ifstream& fs)
{
    std::string h;
    fs >> h;
    std::cout << h << std::endl;
}

int main()
{
    std::istringstream s1("hello");
    std::ifstream s2;
    s2.basic_ios<char>::rdbuf(s1.rdbuf());
    foo(s2);
    return 0;
}

不过,我不确定它有多安全,因此您可以进一步调查该主题。

【讨论】:

  • 谢谢 pptaszni。这正是我需要的!
猜你喜欢
  • 2016-12-05
  • 2014-06-16
  • 1970-01-01
  • 2019-04-06
  • 1970-01-01
  • 1970-01-01
  • 2012-01-25
  • 2013-08-21
  • 2021-04-07
相关资源
最近更新 更多