我应该编写一个类似于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;
Run Code Online (Sandbox Code Playgroud)
有一些关于-n +num参数的代码,但它是内部条件,并不影响这种情况.
我发现,实际上存在零长度字符串,dq.back()但我完全不知道它来自哪里,因为它应该是从文件开头读取的字符串,但是有正常的文本行.
你的读循环是错误的.首先,(*infile).eof()没有真正规定价值; 如果你有一个空文件,它仍然可以返回
false.其次,在开始进入循环之前,你没有读过一行.编写这样的循环的经典方法是:
std::string line;
while ( std::getline( *infile, line ) ) {
// ...
}
Run Code Online (Sandbox Code Playgroud)