【发布时间】:2011-08-22 01:14:03
【问题描述】:
我正在使用 in.get() 计算标准输入流 (cin) 中非空白字符的数量。对于不是空白字符的每个字符,我都会增加一个计数器。
数完之后,我想回去读一下字符。 in 是 std::istream& in 类型的参数(在本例中为 cin)。
这是我正在尝试的:
std::streampos sp = in.tellg();
while(in)
{
char c = in.peek();
if(isspace(c))
break;
++str.mSize;
in.get();
}
in.seekg(sp);
sp的值为-1表示失败。为什么?
【问题讨论】:
-
为什么你需要先知道非空白字符的数量,然后才能从流中读取?完全没有这个问题,可能会有更好的解决一般问题的方法。
-
我需要动态分配一个缓冲区来保存字符。我正在尝试在不使用 STL 容器的情况下实施解决方案。
-
按照规范,
stdin一次只能访问一个字符 - 它不能返回。您必须使用 STL 容器或自制缓冲区,这可能会比 STL 更糟糕。 -
谢谢丹妮。听起来我必须分配一个初始缓冲区来保存所有内容,然后对其进行排序,然后将我想要的内容复制到我的第二个缓冲区中。这听起来不是很有效,但这就是为什么存在 STL 容器的原因,我猜。如果我想继续使用这种涉及 2 个自制缓冲区的低效解决方案,知道如何为初始存储缓冲区选择合适的大小吗?
-
首先使用 1 的大小。每次您没有足够的空间时,将大小乘以 2:1、2、4、8、16 等。这保证了分配的复杂性在平均情况下不会高于缓冲的复杂性。 (简单来说:它不会减慢任何速度)。
标签: c++