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(これはおそらく間違ったチェックです) 。したがって、最終的には空白が読み取られ、ストリームに EOF が設定されますが、すでにその余分な行を に追加しているため、手遅れです。deque

于 2012-04-18T15:30:25.807 に答える