0

ファイルから数値を読み取り、3つの関数を適用して、別のファイルに出力します。

int main(int argc, char** argv) {
    std::ifstream fin;
    fin.open("input.txt");

    std::ofstream fout;
    fout.open("output.txt", std::ios::app);

    char arr[50];
    int a,b;
    int N;//number to factor

    while (!fin.eof()){
        //Print backward
        fin >> arr;
        PrintBackward( arr );
        fout << endl;

        //Greatest common divisor
        ((fin >> a) >> b);
        fout << gcd( a, b );
        fout << endl;

        //Find prime factor
        fin >> N;
        PrimeFactor(N);
        fout << endl;     
    }

    fin.close();
    fout.close();

    return 0;
}

実行後、結果が複製されます。

olleh
3
2 3 7 
olleh
3
2 3 7

私は同様の記事を読みましたが、それは1つの変数を読み取ることに関するものなので、実行可能ではないようです。

ループbreakの最後にaを設定すれば、問題ありません。while使わない方法はありますbreakか?

4

2 に答える 2

3

while (!whatever.eof())本質的に常に間違っており、ファイルの終わりを正しく検出することは決してありません。あなたの場合、次のように、読み取りをまとめてすべての処理を行うのが最も簡単です。

while (fin >> arr >> a >> b >> N) {
    PrintBackwards(arr);
    fout << "\n";

    fout << gcd(a, b) << "\n";

    fout << PrimeFactor(N) << "\n";
}

重要な部分は、チェックと読み取りを別々に行うのではなく、読み取りの結果をチェックすることです。

もう少しアドバイスがstd::stringあります。配列の代わりにを使用します。また、文字列の反転と印刷を分離するので、次のようなものを使用できます。

fout << reverse(arr)   << "\n" 
     << gcd(a, b)      << "\n" 
     << PrimeFactor(N) << "\n";

操作間の共通性を強調することは、良いことになりがちです。

編集:楽しみのために、必要に応じて別の方法を指摘します。基本的に 4 つの項目をグループとして読み取って処理しているため、そのグループ化をもう少し明示的にすることができます。

struct item { 
     std::string arr;
     int a, b, N;

     friend std::istream &operator>>(std::istream &is, item &i) { 
         return is >> arr >> a >> b >> N;
     }
};

struct process {
    std::string operator()(item const &i) { 
        std::ostringstream buffer;

        buffer << reverse(arr) << "\n" << gcd(a, b) << "\n" << PrimeFactor(N);
        return buffer.str();
    }
}

これにより、標準ライブラリに読み取りと書き込み、ファイルの終わりのチェックなどのすべての詳細を処理させることができます。

std::transform(std::istream_iterator<item>(fin), 
               std::istream_iterator<item>(),
               std::ostream_iterator<std::string>(std::cout, "\n"),
               process());
于 2011-04-16T04:54:15.977 に答える
0

私の推測では、eofのチェックが早すぎます。これは、読み込もうとしたときにのみ設定され、ファイルの最後にいるために読み取りが失敗します。後にこれを追加してみてくださいfin >> arr

if (fin.eof()) break;

実際には、すべてのIO操作の後にエラーをチェックする必要があります。そうしないと、コーディングがお粗末になり、堅牢ではなくなります。

于 2011-04-16T04:51:04.853 に答える