2013-01-03 124 views
0

我会试着再次问这个问题,但比上次更好。在C++中创建一个iostream对象

我有一个程序从各个地方读取二进制数据,然后在我编写的类中对其进行处理。数据将从源代码中读取(可能会有所不同),然后写入流中,并将该流传递到类中以供类处理。

我的努力与搞清楚如何创建iostream并写入/读取它。我曾在不同的地方看过,并在cplusplus.com上阅读过参考文献,但我找不到一个简单的例子来说明如何创建iostream

根据我读过,这里是我的尝试:

#include <iostream> 


using namespace std; 

int main(){ 
    streambuf* sb; 
    iostream s(sb); 

    s.put('h'); //segfault 
} 

坦率地说,我不知道为什么它的段错误,或如何解决它,所以我要求别人来告诉我如何正确地创建一个iostream对象,最终,我将能够执行类似下面的:

void printByN(iostream s, n){ 
    while (s.peek() != eof()){ // I'm not sure this is correct. need help with that too 
     char buf [n]; 
     s.read(&buf, n); 
     cout << buf << endl; 
    } 
} 

int main(){ 
    //create iostream s; 
    char* buf = "hello there my friend"; 
    s.write(buf, strlen(buf)); 
} 

关键是我需要的数据流知道什么时候是空的,并且在返回一个特殊值那一点。我无法使用stringstream,因为二进制数据可能包含空字符,而这些字符并不意味着要终止数据。

如果iostream是这样做的错误方法,请让我知道一个更好的选项。

+4

我会推荐一个[体面的介绍性C++书](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list),而不是试图学习语言从随机网站划伤。你应该有更大的成功! –

+0

你是对的,这是一个假设,所以很抱歉。但上面的代码似乎有基本的错误,比如将未初始化的指针作为参数传递给构造函数... –

回答

5

stringstream正是你想要的。 C++字符串可以包含嵌入的空字符(\0)。如果你不相信我,try it

iostream确实是一个抽象的基类,它本身没有真正的功能。您不应直接创建iostream的实例。

+0

你说得对。 null字符的问题不在于'stringstream'认为它是在它的末尾,而是'while(s.peek())'的测试工作不正常。你能推荐正确的方法来执行这个测试吗? – ewok

+0

@ewok我会建议'while(s.peek()!= EOF)'。您也可以在peek操作之后测试's.eof()'或's.bad()'等以获取更具体的信息。 – cdhowie

+0

它告诉我'EOF'没有被声明。并且使用's.eof()'永远不会结束。 – ewok