Foros del Web » Programación para mayores de 30 ;) » C/C++ »

llenar matriz con archivo

Estas en el tema de llenar matriz con archivo en el foro de C/C++ en Foros del Web. Hola a todos, os planteo mi duda por si alguien me puede ayudar. He construido una matriz de dos dimensiones y me gustaria llenarla utilizando ...
  #1 (permalink)  
Antiguo 23/10/2006, 16:15
 
Fecha de Ingreso: octubre-2006
Mensajes: 4
Antigüedad: 17 años, 6 meses
Puntos: 0
llenar matriz con archivo

Hola a todos, os planteo mi duda por si alguien me puede ayudar. He construido una matriz de dos dimensiones y me gustaria llenarla utilizando un archivo para no tener que llenarla mediante el teclado mientras se ejecuta. La idea es que sea una matriz bastante grande y utilizar un archivo .txt o el que creais que mejor se adapte. Muchas gracias
  #2 (permalink)  
Antiguo 23/10/2006, 17:12
 
Fecha de Ingreso: abril-2006
Ubicación: Acapulco Gro. México
Mensajes: 483
Antigüedad: 18 años
Puntos: 2
el tipo de archivo dependera del tipo de datos que almacenara tu matriz,
si son cadenas, bien puedes usar un fichero de texto, si tus datos son numericos, lo mejor es usar un fichero binario.

el fichero de texto, se leería dentro de un bucle, que lea linea a linea.
si el fichero es binario, puedes leerlo en bloques, segun el tamano de este.

Saludos.
  #3 (permalink)  
Antiguo 23/10/2006, 17:58
 
Fecha de Ingreso: octubre-2006
Mensajes: 4
Antigüedad: 17 años, 6 meses
Puntos: 0
La idea es usar numeros. Que instrucción puedo utilizar para ir leyendolos? Como podria separarlos entre si, con espacios y saltos de linea? Gracias por la respuesta tan pronta
  #4 (permalink)  
Antiguo 24/10/2006, 00:37
 
Fecha de Ingreso: abril-2006
Ubicación: Acapulco Gro. México
Mensajes: 483
Antigüedad: 18 años
Puntos: 2
OK, si los datos seran numericos, es importante tener en cuenta la forma en que se escriben para despues poderlos leer, ya que su almacenamiento es determinado por el tipo del dato guardado.
(En ficheros binarios).

si guardas un entero, el valor guardado así sea 0, ocupara 4 bytes(32 bits)
y tendras que leerlo como entero.
segun esto no es necesario que los guardes con un delimitador.

y para leer y escribir en un fichero binario se utilizan las funciones fread y fwrite respectivamente, sus prototipos los encuentras en el encabezado stdio.h

en cuanto a los ficheros de texto, si que requieres un delimitador, generalmente un espacio.
y para la lectura y escritura de estos ficheros se usan las funciones fgets, fscanf y fputs, fprintf respectivamente.
fputs y fgets es sin formato.
fscanf y fprinf es con formato.

Saludos.
  #5 (permalink)  
Antiguo 24/10/2006, 02:18
 
Fecha de Ingreso: octubre-2006
Mensajes: 4
Antigüedad: 17 años, 6 meses
Puntos: 0
muchas gracias Nivel7, ahora que me has guiado un poco por donde debo ir y que funciones utilizar voy a hacer unas pruebas a ver si me sale. Seguro que vuelvo a molestarte con mis dudas mañana
  #6 (permalink)  
Antiguo 24/10/2006, 04:59
 
Fecha de Ingreso: abril-2006
Ubicación: Acapulco Gro. México
Mensajes: 483
Antigüedad: 18 años
Puntos: 2
aqui tienes un pequeño ejemplo:
se trata de copiar un fichero en otro, los nombres de estos los pasa como parametros a tu programa.

Código:
// copia.c: Copia de ficheros
// Uso: copia <fichero_origen> <fichero_destino>

#include <stdio.h>

int main(int argc, char **argv) {
    FILE *fe, *fs;
    unsigned char buffer[2048]; // Buffer de 2 Kbytes
    int bytesLeidos;

    if(argc != 3) {
       printf("Usar: copia <fichero_origen> <fichero_destino>\n");
       return 1;
    }

    // Abrir el fichero de entrada en lectura y binario
    fe = fopen(argv[1], "rb"); 
    if(!fe) {
       printf("El fichero %s no existe o no puede ser abierto.\n", argv[1]);
       return 1;
    }
    // Crear o sobreescribir el fichero de salida en binario
    fs = fopen(argv[2], "wb"); 
    if(!fs) {
       printf("El fichero %s no puede ser creado.\n", argv[2]);
       fclose(fe);
       return 1;
    }
    // Bucle de copia:
    while((bytesLeidos = fread(buffer, 1, 2048, fe)))
       fwrite(buffer, 1, bytesLeidos, fs);
    // Cerrar ficheros:
    fclose(fe);
    fclose(fs);
    return 0;
}
se estan usando ficheros binarios y el buffer es de tipo, char, en este caso no se necesita de otro tipo.

en caso de que el buffer a leer sea de otro tipo o tal vez sea una estructura.
cambiarias:(por ejemplo)

fwrite(buffer, 1, bytesLeidos, fs);
por
fwrite(buffer, sizeof(int), bytesLeidos, fs);
ó
fwrite(buffer, sizeof(Estructura), bytesLeidos, fs);

tanto en la lectura como en la escritura.

saludos...
  #7 (permalink)  
Antiguo 25/10/2006, 09:23
 
Fecha de Ingreso: octubre-2006
Mensajes: 4
Antigüedad: 17 años, 6 meses
Puntos: 0
He estado mirando tu programa e informandome y al final voy a hacer que la lectura de la matriz se mediante un archivo de texto, de esta forma cualquiera podra hacerlo directamente con algun editor de texto y usando numeros, tabulaciones y saltos de linea.

Te pongo el codigo por si le quieres hechar un vistazo y comentar algo, no hace mucho que trabajo con c++ y seguro que es muy mejorable

#include <iostream>
using namespace std;

int main (){
int **matriz,filas,columnas;
FILE *fichero;

cout<< "Introduce el numero de filas que va a tener la matriz"<< endl;
cin>>filas;
cout<< "Introduce el numero de columnas que va a tener la matriz" << endl;
cin>>columnas;

//Aqui voy a crear la matriz mediante punteros
matriz = new int* [filas];
for(int i=0;i<filas;i++)
matriz[i] = new int [columnas];


//Especifico el archivo que se va a leer, en caso de que no exista o no lo encuentre dará un mensaje de error
fichero = fopen("matriz.txt", "r" );
if (fichero==NULL)
{
printf("Error al abrir el archivo \n");
exit (1);
}

//Leo cada una de las posiciones de mi lista que tengo en el archivo y la voy colocando en su respectivo lugar dentro de la matriz
for(int i=0;i<filas;i++){
for(int j=0;j<columnas;j++){
fscanf( fichero, "%d\t", &matriz[i][j] );
}
}



cout<<"Asi queda la matriz"<<endl;

//Impresion por pantalla
for (int i=0;i<filas;i++){
for (int j=0;j<columnas;j++){
cout<< matriz[i][j]<<" ";
}
cout<<endl;
}

}


Se que debería utilizar alguna funcion como por ejemplo malloc para ir reservando memoria cuando lleno la matriz, creo que deberia ser algo del tipo:
while (i!=columnas){
matriz[i]= (int *)malloc(filas * size(int));
i=i+1;
}
Pero no se si deberia ser así la expresion y en que lugar exacto del codigo ponerlo.
Otra deficiencia que le veo es que necesito entrar por teclado el tamaño de la matriz en vez de averiguarlo al leer matriz.txt, pero creo que eso ya va a ser mas complicado
Gracias Nivel7!
  #8 (permalink)  
Antiguo 25/10/2006, 13:51
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Estás mezclando C con C++.

No, no necesitas hacer ningún "malloc" en medio... "new" es el operador que reserva memoria y se encarga de llamar a malloc. Reserva la memoria que necesites, luego rellena la matriz, y ya está, no hagas más reservas o virguerías.

Por otra parte, no es necesario hacer una matriz bidimensional. Con una de 1 dimensión te vale:

matriz = new int[filas * columnas];

Para acceder a la fila F y columna C, usas:

matriz[columnas*F+C]

Por último (que en tu programa no lo haces), debes liberar la memoria:

delete [] matriz;

O si usas tu matriz bidimensional, deberás ir liberando los int de matriz[i] y luego matriz en sí; al igual que lo hiciste para crear la matriz.

Y en cualquier programa, no mezcles "new/delete" con "malloc/free" porque no tiene sentido.
  #9 (permalink)  
Antiguo 25/10/2006, 19:38
 
Fecha de Ingreso: abril-2006
Ubicación: Acapulco Gro. México
Mensajes: 483
Antigüedad: 18 años
Puntos: 2
Pues sí... Ya MaxExtreme a comentado sobre algunos detalles en tu programa, yo insisto en no mesclar funciones de la libreria estandar se C y las de C++. y no olvides liberar la memoria recervada.

Saludos.
  #10 (permalink)  
Antiguo 26/10/2006, 00:13
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Mi recomendacion es NO usar new y delete salvo para objetos, estas funciones terminan llamando a malloc y free ... solo tienen sentido cuando necesitamos que los constructores/destructores sean llamados tambien.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #11 (permalink)  
Antiguo 26/10/2006, 05:48
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Cita:
Iniciado por Nivel7 Ver Mensaje
Pues sí... Ya MaxExtreme a comentado sobre algunos detalles en tu programa, yo insisto en no mesclar funciones de la libreria estandar se C y las de C++. y no olvides liberar la memoria recervada.

Saludos.
El uso de la librería de C en C++ es perfectamente válida, de hecho, es una parte de la librería de C++ (podríamos decir).

Yo me refería a mezclar new/delete con malloc/free, a incluir <iostream> pero no <cstdio>, etc; y en general al estilo de código que está haciendo. De hecho, para lo que ha hecho, es preferible quedarse en C, pues que sólo está usando C++ para std::cin y std::cout.
  #12 (permalink)  
Antiguo 26/10/2006, 16:17
 
Fecha de Ingreso: abril-2006
Ubicación: Acapulco Gro. México
Mensajes: 483
Antigüedad: 18 años
Puntos: 2
bueno, pues yo me refería a las las librerias de salida y entrada estandar.

stdio.h y iostream, en realidad se pueden usar pero antes tienes que sincronizarlas para garantizar la seguridad del buffer(Que ambas librerias usen el mismo buffer).
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 05:58.