2

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

我的问题是,当我尝试打印比文件中更多的行时,它会在输出开头输出 1 个额外的空白行。这是源代码,其中存储了请求TParams的行数,以及其他一些目前不重要的东西......structint 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()但我完全不知道它来自哪里,因为它应该是从文件开头读取的字符串,但是有正常的文本行。

4

2 回答 2

7

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

std::string line;
while ( std::getline( *infile, line ) ) {
    //  ...
}
于 2012-04-18T15:32:10.470 回答
0

在从流中读取之前检查eof(这可能是错误的检查) 。因此,final 将读取一个空白,然后在流中设置 EOF,但是为时已晚,因为您已经在.deque

于 2012-04-18T15:30:25.807 回答