我有以下问题。我必须实现一个类,该类具有一个字符指针属性,用于指向对象的"代码",如下所示:
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保存信息的地方,但我找不到。我发现的只是提到了其他类型的流。
有人能告诉我是否可以这样做,或者流将缓冲信息保存在哪里吗?
感谢
是的,使用strlen肯定有效。。你可以编写一个示例程序
int main()
{
char buffer[10];
std::cout << "enter buffer:" ;
std::cin >>buffer;
if(strlen(buffer)>6)
std::cout << "size > 6";
getch();
}
对于大于大小6个字符的输入,它将显示大小>6
uhm。。。。>>
读取到第一个空白,而strlen计数到第一个空。如果你确定要读的字符串中间没有空格,并且连续字符不超过100个,那么它们可以混合。否则,您将在投掷之前溢出缓冲区。
此外,访问缓冲区并不会允许所有字符串都已经存在(字符串可能会经过缓冲区空间,需要部分读取并重新填充缓冲区…)
如果空格是分隔符,为什么不直接读入std::string
,并对其最终状态做出反应呢?上面的所有动态都已经在std::string的>>
中进行了处理。
[在下面的评论后编辑]
存储未知大小序列的唯一方法是动态分配空间,并使其随着需要的增长而增长。这就是刺和矢量的作用
无论你是使用它们还是编写自己的代码来分配和重新分配需要更多空间的地方,都不会改变实质。
我开始认为这些需求的唯一原因是看到您编写自己的字符串类的能力。所以只需写:
声明一个包含指针的类的大小和容量,分配一些空间,跟踪存储量,当没有可用的存储区时,分配另一个更宽的存储,复制旧的,销毁它,并相应地调整数据成员。
直接访问文件缓冲区不是一种方法,因为您无法控制文件缓冲区的填充方式。
istream
使用streambuf
。
我发现www.cppreference.com是一个快速引用C++的好地方。您可以去那里了解如何使用streambuf
或其衍生物filebuf
。