难以分析文件中的文本

时间:2013-10-19 21:37:45

标签: c++

我在本实验室的输出中遇到了一个相当有趣的错误,我想知道你们中是否有人能够暗示我的问题所在。

目标是找到记录的高,低,平均值和输出原始记录。 我开始使用一个相当基本的程序来解决一个记录,当我实现这个时,我扩展了程序以使用整个文本文件。最初程序会正确输出:

346 130 982 90 656 117 595高#低#Sum#Average#

当我将它扩展为整个记录的工作时,我的输出停止了我想要的工作方式。

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

3 个答案:

答案 0 :(得分: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()

答案 1 :(得分: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);
}

答案 2 :(得分:0)

感谢您抽出宝贵时间帮我解决这个问题。我从你的两个回复中借了一些东西。

在我的第一个while循环后,我添加了inData.clear(); &安培; inData.seekg(0);.添加这些已停止我的inData&gt;&gt;数字来自-858993460。

我还删除了麻烦的同时(inData&gt;&gt; num)并简单地将其替换为inData&gt;&gt; NUM;

最后,我在第一个for循环中设置需要重新初始化为0的变量。