Tengo una matriz en un fichero que se llama matriz.txt que contiene: 3 3 1 0 1 0 1 0 1 1 1 esta matriz la primera fila indica las dimensiones de la matriz y el resto es la matriz, el problema es que no se como hacer para asociar desde el archivo txt a variable y asi poder guardar los datos en variables, considerando que esta matriz tiene espacios y valores que tengo que aprobechar en el programa. Aparte de esto tengo otro archivo con nombres en columnas: BARCELONA CEUTA MADRID... Como puedo hacer que este contenido asociarlo a variables distintas, que char nombre1 sea Barcelona y char nombre2 sea CEUTA? AGRADECERIA MUCHO UNA AYUDA
Registrado: May 02, 2005 Mensajes: 219 Ubicación: Galicia
Publicado: JAsunto:
- Para leer el contenido del fichero que almacena la matriz te recomiendo que uses la función fscanf(). - Para leer el contenido del fichero que almacena las ciudades puedes usar la función fgets(). Esta función leerá toda la línea, por lo que deberás tener una ciudad en cada línea. Para almacenar las ciudades en variables puedes crear una lista enlazada e ir cargando las ciuidades.
gracias Macu, me podrias poner un pequeño ejemplo que de las paginas que veo las funciones que he leido no las veo muy claras, te lo agradeceria mucho, GRACIAS, me estas siendo de gran ayuda
Haber he intentado hacer el codigo como me as dicho para asociar cada valor de la matriz a una incognita pero no me sale, dejo el codigo y haber si alguien puede solventar el problema:
Registrado: Oct 02, 2004 Mensajes: 1684 Ubicación: Mexico
Publicado: VAsunto:
El operador sizeof te devuelve el numero de caracteres necesarios para almacenar la variable de tipo 'FILE *' pero no te devuelve el tamaño del archivo.
Una posible solucion es:
1) Trata de leer dos numeros (numero de filas y columnas)del archivo, si esto no es posible abortas el programa. 2) Reservas memoria suficiente para "filas * columnas" elementos, esto lo realizas utilizando la funcion malloc. 3) Lees cada elemento del archivo mediante fscanf verificando en cada paso que se pueda leer con exito el elemento, esto no lo implemente en el programa que sigue a continuacion.
Implementado en C estandar:
Código:
#include <stdio.h> #include <stdlib.h>
int main(void) { FILE *entrada; int fil, col; int *matriz; int i, j;
if ((entrada = fopen("datos.txt", "r")) == NULL) return EXIT_FAILURE; if (fscanf(entrada, "%d %d", &fil, &col) != 2){ fclose(entrada); return EXIT_FAILURE; } if (fil < 1 || col < 1){ fclose(entrada); return EXIT_FAILURE; }
if ((matriz = malloc(fil * col * sizeof *matriz)) == NULL){ fclose(entrada); return EXIT_FAILURE; }
for (i = 0; i < fil * col; i++) fscanf(entrada, "%d", &matriz[i]);
puts("Datos leidos:"); for (i = 0; i < fil; i++){ for (j = 0; j < col; j++) printf("%4d", matriz[i * col + j]); puts(""); }
Publicado: VAsunto: Cherry Coke - No Hagas El Indio, Haz El Cherokee
Si no esperas trabajar con matrices muy grandes, puedes pasar de la asginación dinámica de memoria, y declarar una matriz más grande de lo que esperes, por ejemplo, 20×20. _________________ Compra Cds y DVDs sin canon, es la misma calidad y mucho más baratos. [img=http://barrapunto.com/pollBooth.pl?section=&qid=350&aid=2]
rir3760 te agradezco plenamento el aporte, pero tengo una dudilla la funcion Malloc, no la entiendo y no se como hacerla. La matriz ke tengo ke hacer es de 5x5 pero luego me piden que lea de un archivo una de 100x100. Gracias GENTE!!!! Porque si hago lo siguiente el programa me peta cuando almaceno los valores de la matriz en la variable int matriz?
Buenas de nuevo, he probado lo que me as puesto y me salia un error xq tenia que poner delante de malloc (int*) pero olle lo e solucionado y va de perlas, te agradezco muchisimo la ayuda que me as proporcionado, espero terminar esta practica sin tener mas problemas GRACIAS
Vua Mi nuevo problema, ahora estoy con el reconocimiento de nombres del fichero nombres.txt que contiene diferentes nombres con saltos de lineas ago lo del fgets y todo va bien hasta que quiero asociar el tamaño de un string bidimensional que le quiero poner el numero de filas que ha leido anteriormente (la dimension de la matriz) pongo el codigo i comento:
Registrado: Oct 02, 2004 Mensajes: 1684 Ubicación: Mexico
Publicado: DAsunto:
Sasuke escribió:
Código:
char linea[5][50];
aqui esta mi problema quiero poner char linea[iFila][50] pero no me deja me da un error al compilar
Eso se debe a que (supongo) tu compilador solo soporta el estandar de C ISO-C90 (el estandar de facto de C). Con este no se pueden declarar arrays en la forma que tu quieres, en otras palabras:
Código:
char foo[100]; /* Valido */ char bar[100 + rand() / 2]; /* No es valido */
La solucion es utilizar un puntero de tipo 'char (*)[50]' y reservar memoria mediante malloc, seria algo asi:
Código:
char (*linea)[50]; /* puntero a array */
/* ... */
if ((linea = malloc(iFila * sizeof *linea)) == NULL) /* Manejo de error */
for (i = 0; i < iFil; i++){ if (fgets(&linea[i][0], sizeof linea[i], fichero) == NULL) /* Verificar si el estado es: error -O- EOF */
printf("%s", &linea[i][0]); }
/* ... */
free(linea);
Un saludo _________________ The capacity to learn is a gift; The ability to learn is a skill; The willingness to learn is a choice. -- Rebec of Ginaz
rir3760 sigo con el lio de las matrices de nuevo lo que hemos conseguido antes era meter todos los terminos de la matriz en un integer y lo que necesito ahora es hacer posicion 0,0 de la matriz asociarle un valor al 0,1 otro valor i asi sucesivamente el valor de la variable integer seria int Numero[iFil][iCol] pero como reservo espacio con un malloc?
Registrado: Oct 02, 2004 Mensajes: 1684 Ubicación: Mexico
Publicado: LAsunto:
En el programa completo que publicaste antes de este mensaje:
* El error principal se debe a que el bucle donde lees los datos del archivo esta dentro del bucle donde reservas memoria para cada fila y por supuesto esto no es correcto:
Código:
/* Asignar memoria para cada una de las filas */ for(i=0;i<iFil;i++){ if((iMatriz[i]=(int *)malloc(iCol *sizeof(int)))==NULL){ printf("Insuficiente espacio de memoria\n"); return EXIT_FAILURE; }
Este fragmento de codigo deberia estar estructurado de esta forma:
Código:
/* Asignar memoria para cada una de las filas */ for (i = 0;i < iFil;i++) if ((iMatriz[i] = malloc(iCol * sizeof *iMatriz[i])) == NULL){ printf("Insuficiente espacio de memoria\n"); return EXIT_FAILURE; }
/* Leer los datos almacenados en el archivo */ for (i = 0;i < iFil; i++) for (j = 0;j < iCol; j++) if (fscanf(Archivo, "%d", &iMatriz[i][j]) != 1){ puts("Error al leer valores del archivo"); return EXIT_FAILURE; }
* El header 'memory.h' no es parte de la biblioteca estandar de C y no lo necesitas, al menos no en relacion a malloc. * Tienes que liberar la memoria de cada fila antes de liberar 'iMatriz'. * Esta linea:
Código:
gets("");
La deberias de eliminar ya que lo usual es que un programa reviente cuando trate de almacenar N caracteres en "".
El programa modificado es:
Código:
#include <stdio.h> #include <stdlib.h>
int main(void) { FILE *Archivo; int **iMatriz = NULL; int iFil, iCol; int i, j;
if ((Archivo = fopen("Matriz.txt", "r")) == NULL) return EXIT_FAILURE; if (fscanf(Archivo, "%d %d", &iFil, &iCol) != 2) return EXIT_FAILURE; if (iFil < 1 || iCol < 1) return EXIT_FAILURE;
printf("Filas=%i Columnas=%i\n", iFil, iCol);
if ((iMatriz = malloc(iFil * sizeof *iMatriz)) == NULL){ printf("Insuficiente espacio de memoria\n"); return EXIT_FAILURE; }
/* Asignar memoria para cada una de las filas */ for (i = 0; i < iFil; i++) if ((iMatriz[i] = malloc(iCol * sizeof *iMatriz[i])) == NULL){ printf("Insuficiente espacio de memoria\n"); return EXIT_FAILURE; }
/* Leer los datos almacenados en el archivo */ for (i = 0; i < iFil; i++) for (j = 0; j < iCol; j++) if (fscanf(Archivo, "%d", &iMatriz[i][j]) != 1){ puts("Error al leer valores del archivo"); return EXIT_FAILURE; }
/* Prueba: imprimir los datos */ for (i = 0;i < iFil;i++){ for (j = 0;j < iCol;j++) printf("%3d", iMatriz[i][j]); puts(""); } fclose(Archivo);
/* Liberar la memoria de cada fila */ for (i = 0; i < iFil; i++) free(iMatriz[i]); free(iMatriz);
return EXIT_SUCCESS; }
Un saludo _________________ The capacity to learn is a gift; The ability to learn is a skill; The willingness to learn is a choice. -- Rebec of Ginaz
Todas las horas son GMT + 10 Horas Ir a página 1, 2Siguiente
Página 1 de 2
Puede publicar nuevos temas en este foro No puede responder a temas en este foro No puede editar sus mensajes en este foro No puede borrar sus mensajes en este foro No puede votar en encuestas en este foro