如何将 ifstream 转换为 istringstream
how to convert ifstream to istringstream
我有一个函数可以读取 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_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
。
您不能将 std::ifstream
直接转换为 std::istringstream
。
但是,您使用 std::istringstream
的函数应该简单地重写为使用 std::istream
,这样它就可以与 std::istringstream
和 std::ifstream
一起使用.
如果你真的想拿一个std::ifstream
,得到一个std::istringstream
,你应该用std::istreambuf_iterator构造一个临时的std::string
,这是唯一的参数std::istringstream
接受的类型。但这是糟糕的设计。使用std::istream
,直接传递std::ifstream
。
Stringstream 不能从文件中获取,它只能从字符串中获取并输出到字符串。
使用 getline/etc 创建一个字符串来保存文件中的信息,然后将其输入到字符串流中。还要确保在使用前清除字符串流。 Stringstreamname.clear().
不确定你到底需要做什么,但除了你的直接问题,我敢打赌你想一次读一行,即使你还不知道。
在 C++ 中,如果您读入任何不适合的内容,输入将得到 "stuck."
例如,假设输入错误:
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 读取的方式编写代码,而不管它来自哪里。
我有一个函数可以读取 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_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
。
您不能将 std::ifstream
直接转换为 std::istringstream
。
但是,您使用 std::istringstream
的函数应该简单地重写为使用 std::istream
,这样它就可以与 std::istringstream
和 std::ifstream
一起使用.
如果你真的想拿一个std::ifstream
,得到一个std::istringstream
,你应该用std::istreambuf_iterator构造一个临时的std::string
,这是唯一的参数std::istringstream
接受的类型。但这是糟糕的设计。使用std::istream
,直接传递std::ifstream
。
Stringstream 不能从文件中获取,它只能从字符串中获取并输出到字符串。 使用 getline/etc 创建一个字符串来保存文件中的信息,然后将其输入到字符串流中。还要确保在使用前清除字符串流。 Stringstreamname.clear().
不确定你到底需要做什么,但除了你的直接问题,我敢打赌你想一次读一行,即使你还不知道。
在 C++ 中,如果您读入任何不适合的内容,输入将得到 "stuck." 例如,假设输入错误:
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 读取的方式编写代码,而不管它来自哪里。