簡體   English   中英

難以分析文件中的文本

[英]Difficulty analyzing text from a file

我在本練習中的輸出遇到一個相當有趣的錯誤,我想知道你們中的任何人是否能夠暗示我的問題所在。

目標是找到記錄的最高,最低,平均值,總和,並輸出原始記錄。 我從一個相當基本的程序開始解決一條記錄,當我做到這一點時,我將該程序擴展為可以處理整個文本文件。 最初,程序將正確輸出:

346130982 90656656117595高#低#總和#平均#

當我將其擴展為可用於整個記錄時,我的輸出停止了按我希望的方式工作。

0 0 0 0 0 0 0高:0低:0總和:0平均:0 0 0 0 0 0 0 0高:0低:0總和:0平均: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);
}

在內部循環中,您將讀取直到流進入故障模式為止,例如,因為接收到錯誤的格式或流到達末尾。 一旦流進入故障模式,它將保持在此模式,直到使用錯誤標志為止,例如,使用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導致的,該EOF將設置使用in.eof()測試的std::ios_base::eofbit

我認為您的周期太多:)

#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);
}

謝謝你們倆花時間幫助我解決這個問題。 我從您的兩個答復中借來了一些信息。

在我的第一個while循環之后,我添加了inData.clear();。 &inData.seekg(0);。 添加這些阻止了我的inData >> num被填充為-858993460。

我還刪除了煩人的while(inData >> num),並簡單地將其替換為inData >> num;。

最后,我在第一個for循環中將需要重新初始化的變量設置為0。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM