输出开始时的额外行

gil*_*ipf 2 c++ io deque

我应该编写一个类似于Unix tail函数的非常小的程序,我std::deque用来存储我std::getline从提供的文件中读取的行.从前面推,从后面弹出.

我的问题是,当我尝试打印更多行然后有文件时,它会在输出开始时输出1个额外的空白行.这里是源代码,TParamsstructint 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()但我完全不知道它来自哪里,因为它应该是从文件开头读取的字符串,但是有正常的文本行.

Jam*_*nze 7

你的读循环是错误的.首先,(*infile).eof()没有真正规定价值; 如果你有一个空文件,它仍然可以返回 false.其次,在开始进入循环之前,你没有读过一行.编写这样的循环的经典方法是:

std::string line;
while ( std::getline( *infile, line ) ) {
    //  ...
}
Run Code Online (Sandbox Code Playgroud)