Search code examples
c++fileinputfstreamdouble-pointer

add value from file to double pointer


my .h file

#ifndef ADJACENCYMATRIX_H_
#define ADJACENCYMATRIX_H_
#include <iostream>
#include <fstream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
using namespace std;



class AdjacencyMatrix{

private:
    int vertexCount;
    int vertexFirst;
    int edgeCount;
    int **wage;
    int **matrix;

public:
    AdjacencyMatrix();
    virtual ~AdjacencyMatrix();
    bool createFromFile(string path);
    void viewMatrix();



};

#endif /* ADJACENCYMATRIX_H_ */

I read form file and I want to write it to my initialized matrix, but it doesn’t work. Can you help me ?

#include "AdjacencyMatrix.h"

AdjacencyMatrix::AdjacencyMatrix() {
    this->vertexCount=0;
    this->vertexFirst=-1;
    this->edgeCount=0;       
}

AdjacencyMatrix::~AdjacencyMatrix() { }

bool AdjacencyMatrix::createFromFile(string path) {
    fstream file;
    file.open(path.c_str(), fstream::in);
    if (file.good())
    {
        int vertexF,vertexE,wag;
        cout << "file opened" << endl;
        file >> this->edgeCount;
        file >> this->vertexCount;
        file >> this->vertexFirst;

        matrix = new int *[edgeCount];
        wage = new int *[edgeCount];

        for (int i = 0; i < vertexCount; i++)
        {
            matrix[i]=new int[edgeCount];
            wage[i]=new int[edgeCount];
        }

        //fill matrix by zeros
        for (int i = 0; i < vertexCount; i++)
        {

            for(int j=0; j<edgeCount;j++)
            {
                matrix[i][j]=0;
                wage[i][j]=0;
            }
        }

        // fill matrix by 1
        for(int i=0; i<edgeCount; i++)
        {
            file >> vertexF >> vertexE >> wag;
            cout << " w " << wag;
            matrix[vertexF][vertexE] = 1;
        }

        file.close();
        return true;
    }
    cout << "File does not opened" << endl;
    return false;
}

void AdjacencyMatrix::viewMatrix(){
    cout << " Adjacency Matrix ";
    for(int i=0; i<vertexCount; i++)
    {
            for(int j=0; i<edgeCount;i++) {  
                cout << this->matrix[i][j] << " ";
            }
            cout<< endl;
    }
}

and this part does not work(I mean, that nothing is display and showMatrix() does not work). I want to get value from file and then write it as matrix[x][y] = 1 because I want to create a graph path.

for(int i=0; i<edgeCount; i++)
{
    file >> vertexF >> vertexE >> wag; // cout work in this line 
    matrix[vertexF][vertexE] = 1; // does not work 
}

Solution

  • The size of your matrix is wrong:

    matrix = new int *[edgeCount]; // wrong size
    wage = new int *[edgeCount];   // wrong size
    
    for (int i = 0; i < vertexCount; i++)
        {
            matrix[i]=new int[edgeCount];
            wage[i]=new int[edgeCount];
        }
    

    When you define the matrix you should use vertexCount instead, like this:

    matrix = new int *[vertexCount];
    wage   = new int *[vertexCount];
    

    This might lead to segmentation faults or strange behaviour.

    Also, when you read data provided by the user you should validate them:

    file >> vertexF >> vertexE >> wag;
    matrix[vertexF][vertexE] = 1;
    

    Are you sure vertexF and vertexE aren't larger than vertexCount - 1 and edgeCount - 1?