0

テキスト ファイルから整数を取得し、数値、最小数値、最大数値、平均、合計、N 個の数値などを出力するプログラムを作成する必要があります。以下のコードでこれをうまく行うことができます。しかし、行ごとにテキストを処理する必要もあります。私のサンプル ファイルには、1 行にタブで区切られた 7 つの数字があり、合計で 8 行ありますが、1 行あたりの数字、ファイルあたりの行数などはわかりません。

また、ベクトルと配列の使用方法を知っていても、私がいる特定のクラスはそれらに到達していないため、使用したくありません。

ありがとう。

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main() {
    int num;
    int count = 0;
    int total = 0;
    int average = 0;
    string str = "";
    int numLines = 0;
    int lowNum = 1000000;
    int highNum = -1000000;

    ifstream fileIn;

    fileIn.open("File2.txt");

    if (!fileIn) {
        cout << "nError opening file...Closing program.n";
        fileIn.close();
    }
    else {
        while (!fileIn.eof()) {
            fileIn >> num;
            cout << num << " ";
            total += num;
            count++;

            if (num < lowNum) {
                lowNum = num;
            }

            if (num > highNum) {
                highNum = num;
            }
        }

        average = total / count;

        cout << "nnTotal is " << total << "." << endl;
        cout << "Total amount of numbers is " << count << "." << endl;
        cout << "Average is " << average << "." << endl;
        cout << "Lowest number is " << lowNum << endl;
        cout << "Highest number is " << highNum << endl;

        fileIn.close();

        return 0;
    }
}
4

1 に答える 1

0

個々の行を処理する 1 つの方法は、各値を読み取る前に先頭の空白をスキップし、改行に達したときにストリームを失敗状態に設定することです。スキップして値を読み取った後、ストリームが良好な場合、明らかに改行はありませんでした。改行があった場合は、行末で発生する必要があることを処理し、ストリームをリセットして (失敗が に到達したことが原因でない場合eof())、続行します。たとえば、整数を処理し、現在の行を追跡するループのコードは次のようになります。

int line(1);
while (in) {
    for (int value; in >> skip >> value; ) {
        std::cout << "line=" << line << " value=" << value << '\n';
    }
    ++line;
    if (!in.eof()) {
        in.clear();
    }
}

このコードは、次のskip()ように実装できるカスタム マニピュレータを使用します。

std::istream& skip(std::istream& in) {
    while (std::isspace(in.peek())) {
        if (in.get() == '\n') {
            in.setstate(std::ios_base::failbit);
        }
    }
    return in;
}
于 2013-10-21T22:21:48.843 に答える