【发布时间】:2011-08-23 01:57:16
【问题描述】:
我的代码用 ifstream 读取一个文件并解析它,现在我改变了一些东西,我不需要读取文件,因为是从另一个地方读取的,所以我有一个 char* 而不是 ifstream...如何更改使用 ifstream.get() 的代码? 再次感谢
【问题讨论】:
标签: c++ string pointers char ifstream
我的代码用 ifstream 读取一个文件并解析它,现在我改变了一些东西,我不需要读取文件,因为是从另一个地方读取的,所以我有一个 char* 而不是 ifstream...如何更改使用 ifstream.get() 的代码? 再次感谢
【问题讨论】:
标签: c++ string pointers char ifstream
您只需将您的char * 放入std::stringstream。
std::stringstream buffer(your_string);
然后您可以像使用std::ifstream 一样使用buffer(您无法打开或关闭它)。理想情况下,您的 parse-method 将引用 std::istream 作为参数,然后它不会介意它接收什么样的输入流:
void parse(std::istream & input);
由于std::ifstream 和std::stringstream 都继承自std::istream,因此您可以将它们作为参数传递,并且您的解析器无需修改即可运行。
【讨论】:
stringstream,而不是istringstream?为什么他似乎不需要额外的复杂性?
stringstream,即使ostringstream 或istringstream 就足够了。
ifstream和fstream的区别。 stringstream 是双向的,具有所有额外的管理。 (在实践中,我从不使用双向流;这种成语不太合适,它们根据流类型有不同的语义。)
#include <sstream>
#include <fstream>
#include <iostream>
using namespace std;
void mung( istream & is ) {
char c;
while( is >> c ) {
cout << c << endl;
}
}
int main( int argc, char *argv[] ) {
if ( argc > 1 ) {
ifstream ifs( argv[1] );
mung( ifs );
}
else {
istringstream iss( "here is some text to mung" );
mung( iss );
}
}
【讨论】:
正如其他人所说,您可以使用std::istringstream,但在这种情况下,
我更喜欢已弃用(但始终存在)std::istrstream。要么
只需创建一个简单的memory_streambuf,带有imemorystream 和
一个omemorystream:如果你不需要双向,也不需要支持
求,memory_streambuf 不到 10 行代码,总是
有用,并且省去了很多其他解决方案的复杂性。
(如果你只做一次,当然,使用现有的解决方案
是首选。但我发现memory_streambuf 在
很多案例。)
【讨论】:
char[](由char* 指向),那么istrstream 可以直接使用; istringstream 需要转换为 string。没什么大不了的,如果istrstream 不可用,我会使用istringstream,但既然是,为什么不使用可以完全满足您需要的流。 (对于输出来说,差异更显着,因为ostrstream会在输出太多字符时停止并声明错误。)