如何将 ifstream 转换为 istringstream。

5

我有一个函数,它通过istringstream读取一些内容并对其进行操作,所以...我试图使用fstream读取文件,并将fstream对象转换为istringstream对象,以便将其传递给我的函数。我不知道该怎么做。如果可以的话,请帮忙,非常感谢。由于我还是初学者,请尽量简单易懂。

string inputFile(argv[1]);    
ifstream inFile(inputFile.c_str());    
istringstream is;

is >> inFile.rdbuf(); //*******This is wrong and is what I'm having trouble with

function(is);

3
看起来是学习多态的好机会。 - user2486888
4个回答

4
您不能直接将 std::ifstream 转换为 std::istringstream
但是,使用 std::istringstream 的函数应该被重写为使用 std::istream,这样它可以同时用于 std::istringstreamstd::ifstream
如果您真的想取一个 std::ifstream, 并获得一个 std::istringstream, 您应该使用 std::istreambuf_iterator 构造一个临时的 std::string,这是 std::istringstream 接受的唯一参数类型。但这是不好的设计。使用 std::istream,并直接传递 std::ifstream

1
你想要的是 std::istream_iterator:
std::string myString ( std::istream_iterator(inputFile) , std::istream_iterator() ) ;
std::istringstream is ( myString ) ;

这段代码通过使用起始迭代器(std::istream_iterator(inputFile))和结束迭代器(std::istream_iterator())创建一个包含inputFile内容的字符串。然后它从该字符串创建了一个istringstream。
这解决了您当前的问题,但几乎肯定有更好的方法来完成您要尝试的操作。例如:
  • 传递一个istream而不是istringstream(因为这样就无需复制它)。

  • 更改您的算法以不需要istringstream


0

Stringstream无法从文件中读取,它只能从字符串中读取并输出到字符串中。 使用getline等方法创建一个字符串来保存文件中的信息,然后将其输入到stringstream中。在使用完后确保清空stringstream,例如:Stringstreamname.clear()。


0

我不确定你需要做什么,但超出你直接提出的问题,我会打赌你想逐行读取,即使你现在还不知道。

在C++中,如果读入了不合适的内容,输入会“卡住”。 例如,假设输入错误如下:

4 4x

x是一个错别字。

如果你读取它:

int a,b;
cin >> a >> b;

a和b都将是4。但下一次读取时,由于x的原因,它将失败。

相反,将每行读入字符串中:

#include <iostream>
#include <sstream>
#include <fstream>
using namespace std;

int main() {
    ifstream f("input.dat");
    string line;

    getline(f, line);
    istringstream s(line);
    int a,b;
    s >> a >> b;
    cout << (a + b) << '\n';
}

当然,正如其他人所说,您应该编写代码以从 istream 中读取数据,独立于数据来源。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接