由于在处理文件的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
答案 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
});
。 [当然,“正确”阅读数字将需要更多的东西......]