注册 登录
编程论坛 C++教室

这是怎么回事儿?

ddsxd 发布于 2007-04-08 11:17, 487 次点击
编程实现一个可以把文本文件中的数字(文件中每行只有一个数字,行数未知)按照从大到小顺序输出,并求其平均数的类,调试连接都没问题,运行结果也正确, 但是程序结束时系统跳出一个对话框,内容是:"0x00404595"指令引用的"0x00000000"内存。该内存不能为"read"。关掉此对话框之后,又跳出一个内容是"0x00404595"指令引用的"0xdddddddc"内存。该内存不能为"read"。哪里出的问题?请解释一下,谢谢

源代码如下:

//ave.h----------------------------
//---------------------------------
#ifndef HEADER_AVE
#define HEADER_AVE
#include<fstream>
using namespace std;
class Ave //定义这个类
{
protected:
double* d; //数组,用于储存文件中的数据
int s; //整形变量,数组的长度
public:
Ave(ifstream a); //构造函数
void input(ifstream a); //输入数据
void displaybyorder(); //排序并输出
double getave(); //求平均值
~Ave(); //析构
};
#endif


//ave.cpp----------------------- //类中的成员函数的定义
//------------------------------
#include "ave.h"
#include <iostream>
#include <fstream>
using namespace std;
Ave::Ave(ifstream a)
{
s=0;
double t;
for(;a>>t;s++); //用s记录文件中数据的个数
d=new double[s]; //新建一个长度为s的数组
}

void Ave::input(ifstream a)
{
for(int i=0;a>>d[i];i++);
}
void Ave::displaybyorder()
{
int i,j;
for(i=0;i<s;i++) //冒泡法排序
{
double max=d[i],t;
for(j=i+1;j<s;j++)
{
if(d[j]>max)
{
t=d[j];
d[j]=max;
max=t;
}
}
d[i]=max;
}
for(i=0;i<s;i++) //输出
cout<<d[i]<<' ';
cout<<endl;
}
double Ave::getave()
{
double sum=0;
for(int i=0;i<s;i++)
sum+=d[i];
return sum/s; //返回平均值
}
Ave::~Ave()
{
delete[] d; //释放内存
}

//main.cpp------------------------------
----------------------------------------
#include "ave.h"
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
using namespace std;
void main()
{
ifstream fin("aplusb.txt");
ifstream b("aplusb.txt");
Ave a(fin);
a.input(b);
a.displaybyorder();
double d=a.getave();
cout<<d<<endl;
}

[此贴子已经被作者于2007-4-8 11:20:13编辑过]

1 回复
#2
wfpb2007-04-11 09:44

//ave.h----------------------------
//---------------------------------
#ifndef HEADER_AVE
#define HEADER_AVE
#include<fstream>
using namespace std;
class Ave      //定义这个类
{
protected:
    double* d;       //数组,用于储存文件中的数据
    int s;           //整形变量,数组的长度
    ifstream ins;
public:
    Ave(const char *filename);          //构造函数
    void input(ifstream a);       //输入数据
    void displaybyorder();        //排序并输出
    double getave();              //求平均值
    ~Ave();                       //析构
};
#endif



//ave.cpp-----------------------   //类中的成员函数的定义
//------------------------------
#include \"ave.h\"
#include <iostream>
#include <fstream>
using namespace std;
Ave::Ave(const char* filename)
{
    ins.open(filename);    //最好判断下文件是否存在,而且数据要读两遍似乎慢了点
    s=0;
    double t;
    for(;a>>t;s++);                //用s记录文件中数据的个数
    d=new double[s];               //新建一个长度为s的数组
    ins.close();
}


void Ave::input()
{
    ins.open(filename);    //最好判断下文件是否存在
    for(int i=0;a>>d[i];i++);
    ins.close();
}
void Ave::displaybyorder()
{
    int i,j;
    for(i=0;i<s;i++)                   //冒泡法排序
    {
        double max=d[i],t;
        for(j=i+1;j<s;j++)
        {
            if(d[j]>max)
            {
                t=d[j];
                d[j]=max;
                max=t;
            }
        }
        d[i]=max;
    }
    for(i=0;i<s;i++)                 //输出
        cout<<d[i]<<' ';
    cout<<endl;
}
double Ave::getave()
{
    double sum=0;
    for(int i=0;i<s;i++)
        sum+=d[i];
    return sum/s;                   //返回平均值
}
Ave::~Ave()
{
    delete[] d;                     //释放内存
}


//main.cpp------------------------------
----------------------------------------
#include \"ave.h\"
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
using namespace std;
void main()
{
    Ave a(\"aplusb.txt\");
    a.input();
    a.displaybyorder();
    double d=a.getave();
    cout<<d<<endl;
}

1