文件处理:peek()函数在c++中有什么用途

File Handling:What is the use of peek() function in c++?

本文关键字:c++ 什么 函数 处理 peek 文件      更新时间:2023-10-16

由于我在处理文件的eof时遇到了很多问题,每当我用fstreameof进行编码时,我都必须清除流才能使用该流。尽管我搜索了很多关于eof的信息,但我得到了应该开始使用的结果:

fstream file("Filename.txt",ios::in|ios::ate|ios::out);
char str[80];
while(file>>str)
{
    //do the required stuff
}
//clear the stream and reuse it
file.clear();
file.seekp(0);

但我也读过一个名为peek()的函数,它也用于此类目的,但我对它的工作有点困惑,无法在代码中应用它。所以,如果有人能引导我度过难关。

我也听说过一个叫做putback()的函数,那是什么??

第1版

fstream file("Filename.txt",ios::in|ios::ate|ios::out);
char str[80];
while(file>>str)
{
    //do the required stuff
}
//clear the stream and reuse it
file.clear();
file.seekp(0);
//Now do the required writing operation after reading the whole file wherever is required
//I also want to perform writing operations and if this pattern seems most suitable for me

假设你想为C或C++编写一个解析器,你的代码会这样做:

 char c = source.get();
 switch(c)
 {
    ... 
    case '<':
        // May be < or <=
        if (source.peek() == '=')
        {
           source.get();
           return less_or_equal;
        }
        // Ok, not <= so:
        return less;
   ...
}

[我忽略了它可能是模板、转换或其他类似的东西的一部分]

当您有peek()时,对putback()的需求很小,但它确实允许"正常使用"字符的代码在"出错时"将其放回原处。假设你知道<=<更常见,那么你可以做:

 char c = source.get();
 switch(c)
 {
    ... 
    case '<':
        // May be < or <=
        c = source.get();
        if (c == '=')
        {
           source.get();
           return less_or_equal;
        }
        source.putback(c);
        // Ok, not <= so:
        return less;
   ...
}

因为它只在罕见的情况下执行CCD_ 10[根据上面假设的统计]。

可以想象,常见的情况是get,而罕见的情况是不匹配,例如,如果我们想读取一个数字:

  int number = 0;
  do
  {
      char c = input.get();
      if (isdigit(c))
      {
           number *= 10;
           number += c - '0';
      }
      else
      {
           input.putback(c);
      }
while( isdgit(c) );

由于大多数数字中都有一个以上的数字,因此更常见的情况是第一个和后面的字符是一个数字,而不常见的情况则是我们需要调用putback()。[当然,"正确"读取数字需要更多的东西…]

但我也读过一个叫peek()的函数,它也用于

peek()是为另一个目的创建的——它可以让程序一次处理两个字符——本质上是模仿基于C标准库的库部分的ungetc()功能。

使用peek查看是否即将达到eof是有效的,但代码中显示的方法(即while(file>>str))比基于peek的方法更适合C++。

我也听说过一个叫做putback()的函数,那是什么?

std::putback()函数允许您执行与ungetc()FILE*流执行的操作相同的操作。