如何将 ifstream 转换为 istringstream

how to convert ifstream to istringstream

本文关键字:istringstream 转换 ifstream      更新时间:2023-10-16

我有一个函数可以读取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);
不能将

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

你想要的是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 内容的字符串。然后,它从该字符串创建一个字符串流。

这解决了你眼前的问题,但几乎可以肯定有更好的方法来做你想做的事情。例如:

  • 传递istream而不是istringstream(因为这样您就不必复制它(。

  • 将您的算法更改为不需要istringstream

字符串流不能从文件中获取,它只能从字符串中获取并提供给字符串。创建一个字符串来保存文件中的信息,使用 getline/etc 然后将其馈送到字符串流中。还要确保在使用字符串流后清除字符串流,例如 Stringstreamname.clear((。

不确定你需要做什么,但除了你的直接问题之外,我敢打赌,即使你还不知道,你也想一次阅读一行。

在C++中,如果你读到任何不适合的东西,输入就会"卡住"。例如,假设输入错误:

4

4 倍

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读取代码来编写代码,而不管它来自哪里。