文件处理:c ++中peek()函数的用途是什么?

时间:2015-11-16 17:01:05

标签: c++

由于在处理文件的eof时遇到了很多问题,每当我使用fstream进行编码并出现eof时,我必须清除流以便使用该流。虽然我已经搜索了很多关于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

2 个答案:

答案 0 :(得分:2)

  

但我也读过一个名为peek()的函数,它也用于此目的

peek()是为了不同的目的而创建的 - 它允许您的程序一次处理两个字符 - 基本上是基于C标准库从库的一部分模拟ungetc()功能。 / p>

使用peek查看您是否即将点击eof是有效的,但您在代码中显示的方法,即while(file>>str),对于C ++而言比一个方法更为惯用基于peek

  

我也听说过一个名为putback()的函数是什么?

std::putback()功能可让您执行ungetc()FILE*流所做的相同操作。

答案 1 :(得分:1)

假设您要为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;
   ...
}

[我忽略了它可能是模板,转变或其他类似的东西]

putback() peek()时,<=的需求很少,但它确实允许“通常消耗”该字符的代码“如果它出错”则将其放回去。假设您知道< 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; ... } 更常见,那么您可以这样做:

putback

因为在极少数情况下它只会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()

因为,大多数数字中都有多个数字,更常见的情况是第一个和后续字符是一个数字,不寻常的情况是我们需要调用$('.slick-carousel').slick({ variableWidth: true, centerMode: true }); 。 [当然,“正确”阅读数字将需要更多的东西......]