【问题标题】:Matrix - reading from file矩阵 - 从文件中读取
【发布时间】:2015-01-22 16:37:10
【问题描述】:

我在使用函数从文件中读取矩阵时遇到问题...

我的班级是这样的:

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

using namespace std;

class Matrix
{   
public:
Matrix(int, int);
Matrix(const Matrix& copyMatrix);
~Matrix();
Matrix(const char *sciezka);
Matrix& wypelnij(string);
friend ostream& operator<< (ostream&, Matrix&);
Matrix& operator+= (const Matrix&);  
Matrix& operator-= (const Matrix&);
Matrix& operator*= (const Matrix&);
Matrix& operator= (const Matrix&); 
friend Matrix operator* (const Matrix & left, const Matrix & right); 
friend Matrix operator+ (const Matrix & left, const Matrix & right); 
friend Matrix operator- (const Matrix & left, const Matrix & right); 
class AllocError{}; 
class OpenError{}; 
class IncorrectSize{}; 
private:
double **macierz;
unsigned int wiersze, kolumny;      
};

构造函数:

Matrix::Matrix(int x = 1, int y = 1): wiersze(x), kolumny(y)
{

if (wiersze < 1 || kolumny < 1) 
{
    throw AllocError();
}
macierz = new double*[wiersze];

for (unsigned i = 0; i < wiersze; i++)
{
    macierz[i] = new double[kolumny];
    for (unsigned j = 0; j < kolumny; j++)
    {
        macierz[i][j] = 0;
    }
}
}

Matrix::Matrix(const Matrix& copyMatrix)
{
wiersze=copyMatrix.wiersze;
kolumny=copyMatrix.kolumny;

macierz = new double*[wiersze];

for (unsigned i = 0; i < wiersze; i++)
{
    macierz[i] = new double[kolumny];
    for (unsigned j = 0; j < kolumny; j++)
    {
        macierz[i][j] = copyMatrix.macierz[i][j];
    }
}   
}

最后是函数

Matrix::Matrix(const char *sciezka)
{
ifstream plik(sciezka);
if (plik.good() != true) 
{
    throw OpenError();
}
unsigned w, k;
plik >> w >> k;
if (w < 1 || k < 1) throw AllocError();
double **temp = new double*[w];
double *pamiec = new double[w * k];

    for (unsigned i = 0; i < w; i++)
{
    temp[i] = pamiec + (i * k);
}
for (unsigned i = 0; i < w; i++)
{
    for (unsigned j = 0; j < k; j++)
    {
        plik >> temp[i][j];
    }   
}   
wiersze=w;
kolumny=k;
macierz=temp;

//for (unsigned i = 0; i < w; i++)       //IT WORKS TOO
//      {
//          macierz[i] = temp[i];
//  }
for (unsigned i = 0; i < w; i++)
{
    for (unsigned j = 0; j < k; j++)
    {
        macierz[i][j] = temp[i][j];
    }   
}

plik.close();
//delete [] *temp;
 //delete [] temp;  
}

当我在函数末尾不使用 delete 时,它​​工作得很好,当我这样做时,有些数字是错误的。如果我在完成所有计算后不崩溃 Matrix A("text.txt") Matrix B(5,5) Fill.B("B") Matrix C(5,5) C=A+B 等...

@编辑

我只是把 F 的结尾改为:

wiersze=w;
kolumny=k;
//macierz=temp;

macierz = new double*[w];
for (unsigned i = 0; i < w; i++)
{
    macierz[i] = new double[k];
    for (unsigned j = 0; j < k; j++)
    {
        macierz[i][j] = temp[i][j];
    }   
}

 plik.close();
delete [] *temp;
delete [] temp; 
}

有没有更简单的方法从文件中读取?我不太喜欢这段代码

【问题讨论】:

  • 要从文件中读取,您可以使用“stackoverflow c++ 读取文件数组”或“stackoverflow c++ 读取文件矩阵”搜索现有示例
  • 请原谅我的无知,但是您在发布的代码中从文件中的哪个位置读取?

标签: c++ memory matrix


【解决方案1】:

要删除矩阵,您应该按照相反的分配顺序,应该这样做:

for (unsigned i = 0; i < w; i++)
{
    delete [] macierz[i] ;
}
delete [] macierz ;

【讨论】:

  • 结果是否与:delete [] *macierz;删除 [] macierz; ?
  • @arienn 不,请搜索指针和分配删除
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 2013-11-05
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多