如何在c ++中读取标准的istream缓冲区?

时间:2012-01-13 19:46:45

标签: c++ stream buffer

我有以下问题。我必须实现一个具有属性的类,该属性是指向对象的“代码”的char指针,如下所示:

class foo{
     private:
         char* cod;
         ...
     public:
         foo();
         void getVal();
         ...
}

等等,等等。 getVal()是一种从标准istream获取代码并填充所有信息(包括代码)的方法。问题是,标识对象的“代码”不能超过一定数量的字符。必须在不使用getVal()方法的自定义缓冲区的情况下完成此操作,因此我无法执行以下操作:

//suppose the maximum number of characters is 50
void foo::getVal()
{
     char buffer[100];
     cin >> buffer;
     if (strlen(buffer) > 50) //I'm not sure this would work considering how the stream
                               of characters would be copied to buffer and how strlen
                               works, but suppose this tells me how long the stream of 
                               characters was.
     {
        throw "Exception";
     }
     ...
}

禁止这样做。我也不能使用自定义的istream,也不能使用boost库。

我以为我可以找到istream很容易保存信息的地方,但我找不到它。我发现的所有内容都提到了其他类型的流。

有人可以告诉我是否可以这样做或者流保存其缓冲信息的位置?

由于

3 个答案:

答案 0 :(得分:0)

istream使用streambuf

我发现www.cplusplus.com是快速C ++引用的好地方。您可以去那里查看如何使用streambuf或其派生filebuf

答案 1 :(得分:0)

是的,使用strlen肯定会工作..你可以写一个示例程序

   int main()
   {

    char buffer[10];
    std::cout << "enter buffer:" ;
    std::cin >>buffer;
    if(strlen(buffer)>6)
    std::cout << "size > 6";
    getch();
   }

对于大于6个字符的输入,它将显示大小&gt; 6

答案 2 :(得分:0)

嗯.... >>读取第一个空白,而strlen计数到第一个空值。如果你肯定知道在你要阅读的字符串中间没有空格并且连续不超过100个,那么它们可以混合在一起。如果没有,你将在抛出之前超出缓冲区。

此外,访问缓冲区并不会释放所有字符串(字符串可以通过缓冲区空间,需要部分读取并重新填充缓冲区...)

如果空白是分隔符,为什么不直接读入std::string,并对其最终状态作出反应?上面的所有动态都已在>>内为std :: string。

处理

[以下评论后编辑]

存储未知大小序列的唯一方法是动态分配空间并使其随着增长而增长。这不仅仅是 - 不仅仅是刺痛和矢量的作用。

无论您是使用它们还是编写自己的代码来分配和重新分配需要更多空间的地方,都不会改变实质内容。

我开始认为这些要求的唯一原因是看到你编写自己的字符串类的能力。所以...只需写下来:

声明一个类,它包含一个大小和容量的指针,分配一些空间,跟踪存储的数量,当没有可用的存储时,分配另一个更大的存储,复制旧存储,销毁它,并相应地调整数据成员

直接访问文件缓冲区不是办法,因为您无法控制文件缓冲区的填充方式。