2011-05-11 141 views
4

我的代码用ifstream读取一个文件并解析它,现在我改变了一些东西,而且我不需要读取该文件,原因是从另一个地方读取的,所以我有一个char * ifstream ...我怎么能改变我的代码,我使用ifstream.get()? 再次感谢C++ ifstream to char *

回答

8

您只需将您的char *放入std::stringstream即可。

std::stringstream buffer(your_string); 

然后可以使用buffer几乎就像是一个std::ifstream(您不能打开或关闭)。理想情况下,你的解析法将采取的std::istream作为参数的引用,那么就不会介意什么样的输入流接收:

void parse(std::istream & input); 

因为从std::istreamstd::ifstreamstd::stringstream继承,你可以通过它们作为参数,并且您的解析器无需修改即可运行。

+1

为什么'stringstream',和不是'istringstream'?为什么他似乎并不需要额外的复杂性? – 2011-05-11 07:55:21

+0

@詹姆斯:好点。我认为,即使“ostringstream”或“istringstream”就足够了,总是使用'stringstream'是我的一个坏习惯。 – 2011-05-11 07:56:59

+0

谢谢牛仔!工作正常,我没有改变太多我的代码! – ghiboz 2011-05-11 08:21:29

2
#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); 
    } 
} 
1

正如其他人所说,你可以使用std::istringstream,但在这种情况下, 我宁愿不推荐使用的(但总是存在)std::istrstream。或者干脆 创建一个简单的memory_streambuf,与imemorystream和 的omemorystream:如果你不需要是双向的,也不支持 寻求的memory_streambuf是代码不到10行,总是 有用的,并且留下了很多其他解决方案的复杂性。 (如果你只是在做这一次,当然,使用现有的解决方案 是首选,但我发现memory_streambuf在 是有用的一些案件。)

+0

作为利益的问题,为什么偏好istrstream? – 2011-05-11 08:09:20

+0

@unaperson简单。也许习惯,在某种程度上,但是如果他有'char []'(由'char *'指向),那么'istrstream'可以直接使用它; 'istringstream'将需要转换为'string'。没什么大不了的,如果'istrstream'不可用,我会使用'istringstream',但既然是这样,为什么不使用可以完全满足你需要的流。 (对于输出,差异更加显着,因为当输出太多字符时,ostrstream将停止并声明错误。) – 2011-05-11 08:40:43