【问题标题】:creating an iostream object in c++在 C++ 中创建一个 iostream 对象
【发布时间】:2012-12-18 00:51:58
【问题描述】:

我打算再试一次,但比上次好。

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

我的困难在于弄清楚如何创建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 是错误的做法,请告诉我更好的选择。

【问题讨论】:

  • 我建议您获得decent introductory C++ book,而不是尝试从随机网站从头开始学习语言。你应该取得更大的成功!
  • 你是对的,这是一个假设,所以很抱歉。但是您上面的代码似乎存在基本错误,例如将未初始化的指针作为参数传递给构造函数...

标签: c++ stream iostream


【解决方案1】:

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

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

【讨论】:

  • 你是对的。空字符的问题不是stringstream 认为它已经结束,而是while (s.peek()) 的测试没有正常工作。您能推荐执行此测试的正确方法吗?
  • @ewok 我建议while (s.peek() != EOF)。您也可以在 peek 操作后测试s.eof()s.bad() 等以获得更具体的信息。
  • 它告诉我EOF 没有被声明。并且使用s.eof() 永远不会到达终点。
  • @ewok 我想你必须#include &lt;cstdio&gt;
  • @ewok 是的,如果输入字符串包含嵌入的空值,您需要明确指定输入字符串的长度。当给定一个没有长度的char const * 时,C++ 字符串类将使用空终止测试来查找长度。如果您自己指定长度,则跳过此测试。
猜你喜欢
  • 2020-04-28
  • 1970-01-01
  • 1970-01-01
  • 2015-10-14
  • 2011-04-08
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
相关资源
最近更新 更多