输出开始时的额外行

时间:2012-04-18 15:25:14

标签: c++ io deque

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

我的问题是,当我尝试打印更多行然后有文件时,它会在输出开始时输出1个额外的空白行。以下是源代码,TParamsstruct 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()中实际存在零长度字符串,但我完全不知道它来自何处,因为它应该是从文件开头读取的字符串,但是有正常的行文本。

2 个答案:

答案 0 :(得分:7)

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

std::string line;
while ( std::getline( *infile, line ) ) {
    //  ...
}

答案 1 :(得分:0)

您在从流中读取之前检查eof(这可能是错误的检查)。所以决赛将读取空白,然后在流中设置EOF,但为时已晚,因为您已经将额外的行添加到deque