Problema con fstream en c++

Iniciado por anamnesis_92, 6 Febrero 2012, 20:57 PM

0 Miembros y 1 Visitante están viendo este tema.

anamnesis_92

Buenas a todos, estoy haciendo un juego y una clase me da error, y no se a que se debe; la función debería leer de un archivo números de 5 cifras, después almacenarlos en una matriz de 4 columnas por un numero de filas que es el primer numero del archivo.
A ver si me podéis ayudar a arreglar el código.


#include <iostream>
#include <fstream>
using namespace std;

class matriz
{
    public:
    int filas;
    char cadena[5];
    int **m;

    void leer(char* s)
    {
        //abrimos
        ifstream fe;
        fe.open(s,ios::in);
        if(!fe)
        {
            cout<<"fallo"<<endl;
        }
        //leemos
        //con la primera linea sacamos las filas
        fe.getline(cadena,6);
        //para pasar la cadena a un int
        filas=(cadena[0]-48)*10000+(cadena[1]-48)*1000+(cadena[2]-48)*100+(cadena[3]-48)*10+(cadena[4]-48);
        //iniciamos la matriz
         m=new int *[filas];
        for(int i=0;i<=filas;i++)
        {
            m[i]=new int[4];
        }
        //seguimos leyendo
        for(int i=0;i<filas;i++)
        {
            for(int j=0;j<4;j++)
            {
                fe.getline(cadena,6);
                m[i][j]=(cadena[0]-48)*10000+(cadena[1]-48)*1000+(cadena[2]-48)*100+(cadena[3]-48)*10+(cadena[4]-48);

            }
        }
        fe.close();
    }

    void destruir()
    {
         for(int i=0;i<=filas;i++)
        {
            delete [] m[i];
        }
        delete [] m;
    }

};

int main()
{
    matriz matriz1;
    matriz1.leer("mapa1.txt");
    matriz1.destruir();
    return 0;
}


Gracias a todos por adelantado.

Kropt32

Si en una función vas a pasarle una cadena constante, pon el argumento como constante también 'const char*'...

void leer(const char* s)
En las pistolas, fíjense, a cada disparo el cañon recula, como asustado por lo que acaba de hacer.

adastra

Cual es el error que te esta dando? mandanos una traza o algo...

anamnesis_92

Lo primero gracias por responder; he utilizado const y ya compila pero colocando un cout<<m[j] en la linea 38 compruebo que no hace los que esperaba, asi que sigo sin saber donde esta el fallo....

Kropt32

#4
En el tratamiento de error al abrir el fichero, muestras "Fallo", sin embargo sigues leyendo, pon un return al menos.

Linea:
for(int i=0;i<=filas;i++)

Esta linea cambiala hasta '< filas', porque si le pones '<= filas', le estás obligando que se meta en una posición de memoria del array no asignada, la última posición de un array es 'tamaño - 1'.

Al final, dentro de la función main(), lees el fichero y a pesar de no saber si se ha leido bien, porque das por hecho que se lee bien, destruyes la clase. y esto provoca un fallo de segmentación porque la matriz no se ha creado.

Es lo que puedo decirte de vista rápida. Pureba a solucionar eso...

El paso a int hay una función que te lo hace todo muy bonito, atoi()
En las pistolas, fíjense, a cada disparo el cañon recula, como asustado por lo que acaba de hacer.

anamnesis_92

Muchisimas gracias por contestar; y aunque no me salen mas fallos sigue sin hacerlo bien. De todas formas gracias.