4

この問題は一晩中私を悩ませました.Thanks!

このコードは、ファイルの最後の行を 2 回書き込みます。

#include <iostream>
#include <fstream>
#include <string.h>
using namespace std;
const int strSize = 1000;
int main(int argc,char *argv[])
{
    ifstream infile(argv[1]);
    if(!infile)    cerr<<"infile error!"<<endl;
    ofstream outfile(argv[2]);

    int sequenceNum = 1;
    char str[strSize];
    while(infile){
        infile.getline(str,strSize);
        if(sequenceNum>469)
            str[0] = '2';
        else if(sequenceNum>67)
            str[0] = '4';
        else if(sequenceNum>1)
            str[0] = '1';
        else
            str[0] = '3';
        outfile<<str<<endl;
        ++sequenceNum;
    }
    return 0;
}

isの後infile.getline(str,strSize);、str が変更されていない場合、null はなぜですか? しかし、その後、最終行になります。strNULLif(sequenceNum>469)str

このコードは、最後の行を 1 回だけ書き込みます。

#include <iostream>
#include <fstream>
#include <string.h>
using namespace std;
const int strSize = 1000;
int main(int argc,char *argv[])
{
    ifstream infile(argv[1]);
    if(!infile)    cerr<<"infile error!"<<endl;
    ofstream outfile(argv[2]);

    int sequenceNum = 1;
    char str[strSize];
    while(infile){
        infile.getline(str,strSize);
        if(strlen(str) != 0){//The key is this sentence.
            if(sequenceNum>469)
                str[0] = '2';
            else if(sequenceNum>67)
                str[0] = '4';
            else if(sequenceNum>1)
                str[0] = '1';
            else
                str[0] = '3';
            outfile<<str<<endl;
            ++sequenceNum;
        }
    }
    return 0;
}
4

4 に答える 4

10

問題はinfile.getline、最後の行を読み取る (つまり、EOF まで読み取る) 場合while(infile)でも true と評価され、ループが再度実行されることです。ただし、infileファイル全体を読み取ったため、infile.getline失敗し、str空の文字列になります。ただし、元のコードは最初の文字を上書きするため、null ターミネータが取り除かれ、前回の内容を再利用することになります。

代わりに、次のようなものが必要です。

while (infile.getline(str, strSize)) {
    if (sequenceNum>469)
    ...
}
于 2013-07-31T13:28:07.443 に答える
2

問題は、最後の行を読んだ後でも、infileが として評価されることtrueです。別の行を読み取ろうとして (そして失敗してから) のみ、false と評価されます。forループは test-read-print になるため、終了する前に古い内容の読み取りと出力に失敗しますstr

代わりにこれを試してください:

while(infile.getline(str,strSize))
  ...
于 2013-07-31T13:28:57.727 に答える