我应该编写一个类似于Unix tail
函数的非常小的程序,我使用std::deque
来存储我从提供的文件std::getline
读取的行。从前面推出,从后面弹出。
我的问题是,当我尝试打印更多行然后有文件时,它会在输出开始时输出1个额外的空白行。以下是源代码,TParams
是struct
int lncount
,其中存储了请求的行数,还有其他一些不重要的东西...
using namespace std;
deque<string> dq;
int counter = 0;
for(string line; ! (*infile).eof(); getline(*infile, line)){
dq.push_front(line);
// not needed lines dropped immediately
if(counter++ >= TParams.lncount)
dq.pop_back();
}
int iter = (TParams.lncount > dq.size()) ?
(dq.size() - 1) : (TParams.lncount - 1);
assert(iter < dq.size());
for(iter; iter >= 0; iter--)
cout << dq[iter] << endl;
还有一些关于-n +num
参数的代码,但它是在条件内并且不会影响这种情况。
我发现,dq.back()
中实际存在零长度字符串,但我完全不知道它来自何处,因为它应该是从文件开头读取的字符串,但是有正常的行文本。
答案 0 :(得分:7)
您的读取循环错误。首先,值(*infile).eof()
不是
真的指定;如果你有一个空文件,它仍然可以返回
false
。其次,你在进入之前没有读过一行
循环开始。编写这样的循环的经典方法是:
std::string line;
while ( std::getline( *infile, line ) ) {
// ...
}
答案 1 :(得分:0)
您在从流中读取之前检查eof
(这可能是错误的检查)。所以决赛将读取空白,然后在流中设置EOF,但为时已晚,因为您已经将额外的行添加到deque
。