| |||
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 |
| |||
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. |
| |||
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. |
| |||
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 |
| |||
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:
se estan usando ficheros binarios y el buffer es de tipo, char, en este caso no se necesita de otro tipo.// 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; } 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... |
| |||
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! |
| |||
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. |
| |||
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. |
| |||
Cita: 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. |
| |||
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). |