0

このラボの出力で面白いエラーが発生しました。私の問題がどこにあるのか、誰かがヒントをくれるのではないかと思っていました。

目標は、記録の最高、最低、平均、合計を見つけ、元の記録を出力することです。1 つのレコードを解決するためのかなり基本的なプログラムから始めました。これを達成したとき、プログラムを拡張して、テキスト ファイル全体を処理できるようにしました。最初、プログラムは正しく出力します:

346 130 982 90 656 117 595 高# 低# 合計# 平均#

レコード全体で機能するように拡張すると、出力が意図したとおりに機能しなくなりました。

0 0 0 0 0 0 0 High: 0 Low: 0 Sum: 0 Average: 0 0 0 0 0 0 0 0 High: 0 Low: 0 Sum: 0 Average: 0 など...

私のifstreamがファイルから値を入力するのを完全にやめた理由がよくわかりません。

私は散歩に行き、それで別のクラックを取ります。それでもうまくいかない場合は、ここに戻って応答を確認します =)

ありがとうございました!

#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>
using namespace std;
int main()
{
    int num;
    int high = 0;
    int low = 1000;
    double average = 0;
    double sum = 0;
    int numcount = 0;
    int lines = 1;
    char endoline;
    ifstream inData;
    ofstream outData;

    inData.open("c:\\Users\\Nikko\\Desktop\\record5ain.txt");
    outData.open("c:\\Users\\Nikko\\Desktop\\record5aout.txt");
    if(!inData) //Reminds me to change path names when working on different computers.
    {
        cout << "Could not open file, program will exit" << endl;
        exit(1);
    }
    while(inData.get(endoline))
    {
        if(endoline == '\n')
            lines++;
    }

    for(int A = 0; A < lines; A++)
    {
        for(int B = 0; B < 7; B++)
        {
            while(inData >> num)
            inData >> num;
            numcount++;
            sum += num;
            if(num < low)
                low = num;
            if(num > high)
                high = num;
            average = sum / numcount;
            outData << num << '\t';
        }
        outData << "High: " << high << " " << "Low: " << low << " " << "Sum: " << sum << " " << "Average: " << average << endl; 
    }   

inData.close();
outData.close();
return(0);
}
4

3 に答える 3

0

内側のループでは、たとえば、誤った形式を受信したか、ストリームが最後に達したために、ストリームが失敗モードになるまで読み取ります。ストリームが失敗モードに入ると、エラー フラグが使用されるまで、このモードのままになりますinData.clear()。あなたの入力がどのように見えるかはわかりませんが、それが完全に数字で構成されるファイルであると仮定すると、ファイル全体を読み取るだけです。早く読書から抜け出したい場合は、何かをする必要があります。たとえば、マニピュレータを使用して空白をスキップし、改行に到達したときにストリームを失敗状態に設定できます。

std::istream& skip(std::istream& in) {
    std::istream::sentry cerberos(in, false);
    if (in) {
        while (std::isspace(in.peek()) {
            if (in.get() == '\n') {
                std::in.setstate(std::ios_base::failbit);
            }
        }
    }
}

...後で、整数を読み取るときにこれを使用します。

int value(0);
while (in >> skip >> value) {
    // ...
}
// ... 
if (!in.eof()) {
    in.clear();
}

が改行にskip遭遇すると、レコード (行) が読み取られたため、ストリームは失敗モードに設定されます。行を処理した後、エラーが EOF に到達したことが原因でない限り、ストリームの状態はクリアされます。これにより、std::ios_base::eofbitを使用してテストされin.eof()ます。

于 2013-10-19T21:49:47.070 に答える
0

サイクルが多すぎると思います:)

#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>
using namespace std;
int main()
{
int num;
int high = 0;
int low = 1000;
double average = 0;
double sum = 0;
int numcount = 0;
int lines = 1;
char endoline;

ifstream inData;
ofstream outData;

inData.open("c:\\Users\\Nikko\\Desktop\\record5ain.txt");
outData.open("c:\\Users\\Nikko\\Desktop\\record5aout.txt");
if(!inData) //Reminds me to change path names when working on different computers.
{
    cout << "Could not open file, program will exit" << endl;
    exit(1);
}
while(inData.get(endoline))
{
    if(endoline == '\n')
        lines++;

    sum = 0;
    average = 0.;
    high  = 0;
    low = 1000;
    //you have to reinitialize these values for every row
    while(inData >> num) 
    {
        numcount++;
        sum += num;
        if(num < low)
            low = num;
        if(num > high)
            high = num;
        average = sum / numcount;
        outData << num << '\t';
    }
    outData << "High: " << high << " " << "Low: " << low << " " << "Sum: " << sum << " " << "Average: " << average << endl; 
}


inData.close();
outData.close();
return(0);
}
于 2013-10-19T21:52:47.963 に答える