C++ 如何将ifstream转换为istringstream

C++ 如何将ifstream转换为istringstream,c++,fstream,istringstream,C++,Fstream,Istringstream,我有一个函数,可以读取istringstream,并对其执行一些操作,因此。。。我正在尝试使用fstream读取文件,并将fstream对象转换为istringstream,以便将其传递给我的函数。我不知道怎么做。任何帮助都将不胜感激。我还是一个初学者,所以如果可以的话,请保持简单 string inputFile(argv[1]); ifstream inFile(inputFile.c_str()); istringstream is; is >> inFile

我有一个函数,可以读取
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::istream\u迭代器

std::string myString ( std::istream_iterator(inputFile) , std::istream_iterator() ) ;
std::istringstream is ( myString ) ;
这将通过使用开始迭代器(
std::istream\u迭代器(inputFile)
)和结束迭代器(
std::istream\u迭代器()
)创建包含inputFile内容的字符串。然后,它从该字符串创建一个istringstream

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

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

  • 将算法更改为不需要
    istringstream


不能将
std::ifstream
直接转换为
std::istringstream

但是,使用
std::istringstream
的函数只需重写为使用
std::isttream
,这样它就可以与
std::istringstream
std::ifstream
一起使用


如果您确实想要获取一个
std::ifstream
,并获取一个
std::istringstream
,那么应该使用std::istreambuf\u迭代器来构造一个临时的
std::string
,这是
std::istringstream
接受的唯一参数类型。但那是个糟糕的设计。使用
std::istream
,并直接传递
std::ifstream

Stringstream不能从文件中获取,它只能从字符串中获取并发送给字符串。
使用getline/etc生成一个字符串来保存文件中的信息,然后将其馈送到stringstream中。另外,请确保在使用stringstream后清除stringstream,例如Stringstreamname.clear()。

不确定您到底需要做什么,但除了您直接提出的问题之外,我敢打赌,您每次都想读一行,即使您还不知道

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

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';
}
#包括
#包括
#包括
使用名称空间std;
int main(){
iff流(“input.dat”);
弦线;
getline(f,line);
IstringStreams(线);
INTA,b;
s>>a>>b;

cout看起来是学习多态性的好机会。