2009-01-31 38 views
16

什么是获取字符串或char *指针到一个istream的最佳方式。获取字符串或char *到istream中的最佳方法?

我想要做以下

std::string a = "abc.."; 

//I know this can be done, not sure if this is most efficient 
// and not sure about char* pointers 
std::istringstream istr (a); 
... 
foo (istr); 


void foo(std::istream& is) { 

} 
+0

对不起;这并不完全清楚你在这里问什么。你想能够访问一个字符串,就好像它是一个流?你想达到什么目的? – Rob 2009-01-31 19:25:39

+0

现在编辑了这个问题。 – kal 2009-01-31 19:31:52

回答

12

这将工作:

std::istringstream is("abc..."); 

而且由于istringstream是istream的,你就可以用你的对象作为一个IStream。

15

如果你想从它构建istringstream,一个char *到空字符,或从的std :: string所有的东西:

istringstream str(ptr); // char* 
istringstream str(other_str); // std::string 

如果说起想要一个原始指针进入一个istream的缓冲区,你不能这样做。如果流需要文件,终端或其他内容,可以选择缓冲它们的内容,那么Streams会按需提供数据(不完全正确,你可以使用strstream,它接受一个原始指针并直接读取/写入数据。这是一个弃用的课程 - 不要使用它,我很幸运,我从来没有这样做过)。如果所有你想要的东西都可以像指针一样使用,你可以使用streambuf迭代器。他们是不是真的指针的,所以你不能从begin和其他东西减去end

std::istreambuf_iterator<char> begin(one_istream), end; 
while(begin != end) 
    std::cout << *begin++; 

如果你谈论得到一个字符串,出了什么事情被写入一个字符串流,你可以使用ostringstream::str

ostringstream o; 
o << "This is a number: " << 42; 
std::string str = o.str(); // str == "This is a number: 42" 

否则,你只能通过阅读东西从istream。你需要一个ostream,那么你可以做

stream.write(ptr, N); 
stream.write(ptr.c_str(), ptr.c_str() + ptr.size()); 

写入从字节是STR分,正好N个字符。您也可以使用<<将它写入流中。它会将所有内容写入空字符或std :: string中的所有内容,但会尊重格式化标志,如字段宽度:

stream << ptr; // char* 
stream << other_str; // everything from std::string 
相关问题