【问题标题】:cin stream positioncin流位置
【发布时间】: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++


【解决方案1】:

并非所有输入流都是可搜索的——如果stdin 来自终端或管道,则无法向前或向后搜索它。在这种情况下,您必须自己缓冲数据。

【讨论】:

  • 感谢您的回答。我试图在不使用 STL 容器的情况下实施解决方案。我想首先计算连续非空白字符的数量,以便我可以动态分配适当大小的缓冲区来保存它们。但我想唯一的解决方案是分配两个缓冲区。但在这种情况下,我不知道如何为我的初始存储缓冲区选择合适的大小。
猜你喜欢
  • 2013-12-11
  • 1970-01-01
  • 1970-01-01
  • 2015-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-09
  • 1970-01-01
相关资源
最近更新 更多