Autor
|
Tema: Ayuda con fichero y cadenas en C (Leído 4,491 veces)
|
luar79
Desconectado
Mensajes: 12
|
Hola, agradeceria si me podeis ayudar, estoy con un programilla que lee desde un fichero varias lineas donde hay el nombre de una ciudad, un espacio, el nombre de otra ciudad, otro espacio y los kilometros entre ellas. El problema es que no consigo que tras leer una de las lineas en la variable linea, pasarsela a una array de cadenas para despues con un par de bucles for ir rellenando una matriz dinamica. No se si estoy planteando bien el copiar directamente la linea al array, o el problema esta en que debo poner \0 al final de la linea. Yo he impreso printf("%s\n", linea); dentro del bucle while e imprime bien cada linea, pero al compilar se abre el prompt y finaliza el programa sin mostrar nada por pantalla. Pego el codigo por si me podeis ayudar. Gracias: char * campo; char ** datos; int filas=0; int MaxLinea=maxLinea; char lineaFinal[maxLinea]; char linea[maxLinea]; datos =malloc(sizeof(char*)*1); // se lee cada fila de todo el fichero de elementos while(fgets(linea ,MaxLinea ,fichero ) >0 ) { strcpy(lineaFinal [filas ],linea ); filas++; datos =realloc(datos ,sizeof(char*)*filas ); } for(int i=0; i<filas; i++) { datos =realloc (datos ,sizeof(char)*3); } for(int i=0; i<filas; i++) { for(int j=0; j<3; j++) { campo = strtok(lineaFinal [filas ], " "); datos[i][j]=campo; datos[i][j]=campo; datos[i][j]=campo } }
MOD: El código debe ir entre etiquetas de Código GeSHi
|
|
« Última modificación: 4 Mayo 2022, 22:23 pm por K-YreX »
|
En línea
|
|
|
|
K-YreX
|
El código pegado puede dar lugar a errores de interpretación porque está cortado. Así hay muchas cosas que tenemos que presuponer además de no saber si estás en una función auxiliar, en el main() o cosas por el estilo. Sin embargo, de momento veo algunas cosas "sospechosas"... - Línea 4 - No tiene mucho sentido.
- Líneas 7 y 8 - Extraño... Estás asignando ambas líneas a la misma variables.
- Líneas 13 y 14 - 'lineaFinal[0]' es un char, no un char*. Estás intentando copiar cadenas enteras ('linea') dentro de chars...
La forma más sencilla es leer cada campo por separado. Ejemplo simple: const MAX_LONGITUD_CIUDAD= 50; int main() { char ciudad1[MAX_LONGITUD_CIUDAD]; char ciudad2[MAX_LONGITUD_CIUDAD]; float kms; FILE *f = fopen("fichero.txt", "r"); while(fscanf(f , "%s %s %f", ciudad1 , ciudad2 , &kms ) == 3) { // fscanf devuelve el numero de variables que ha asignado correctamente, en este caso 3 printf("La ciudad 1 es: %s\n", ciudad1 ); printf("La ciudad 2 es: %s\n", ciudad2 ); printf("Los kms entre ellas son: %.2f km\n", kms ); } // Si ejecutas este programa directamente haciendo doble click sobre el exe, no te dara tiempo a ver nada antes de que la consola de Windows se cierre. Solucion: getchar(); // getchar() espera a que pulses una tecla. Una vez pulsada cualquier tecla, el programa se cerrara }
Esta solución es suficiente si estás 100% seguro de que ninguna cadena de texto va a superar el límite de longitud de los arrays. En caso contrario, tendrás que utilizar delimitadores para el ancho y/o otro tipo de comprobaciones. PD: Yo no guardaría esto en una matriz pues en tal caso todos los datos tienen que ser del mismo tipo y no tiene demasiado sentido guardar kilómetros en formato string. Lo mejor sería crear un struct más o menos como esto: struct Ruta { char *ciudad1; char *ciudad2, float distancia; }
Y utilizar un Ruta[] para guardar todas las líneas del fichero. Más correcto que un char[][].
|
|
|
En línea
|
cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
|
|
|
MAFUS
Desconectado
Mensajes: 1.603
|
Otra cosa que no se recomienda es que un realloc se realice sobre la misma variable, es decir: datos=realloc(datos,sizeof(char*)*filas)
|
|
|
En línea
|
|
|
|
luar79
Desconectado
Mensajes: 12
|
Gracias!,
struct, pero lo tengo que pasar despues a una matriz porque es para pasarle los datos al algoritmo warshall y vea si no hay conexiones entre ciudades.
Gracias por la idea!
|
|
« Última modificación: 6 Mayo 2022, 13:26 pm por luar79 »
|
En línea
|
|
|
|
K-YreX
|
He investigado un poco el algoritmo Warshall... Sí, necesitas una matriz. Pero los nombres de las ciudades no tienen que estar en dicha matriz. Debes utilizar una matriz: float matriz_warshall[][] donde el elemento matriz_warshall[i][j] contiene la distancia para ir de la ciudad i a la ciudad j. Por lo tanto, soluciones: - Si sabes la cantidad y nombre de ciudades que hay, en tiempo de compilación
En este caso podrías crear otra struct que relacione cada ciudad con un índice (simulando un Map)
typedef struct { int indice; char *nombre; } Ciudad; const int NUM_CIUDADES = 3; int main() { Ciudad ciudades[NUM_CIUDADES] = { // NUM_CIUDADES aqui es opcional {0, "Ciudad 1"}, {1, "Ciudad 2"}, {2, "Ciudad 3"} }; float matriz_warshall[NUM_CIUDADES][NUM_CIUDADES]; while(fscanf(f , "%s %s %f", ciudad_origen , ciudad_destino , distancia ) === 3) { // Cada vez que leas una linea, tienes que buscar a que indices corresponden esas ciudades int indice_origen = buscarIndice(ciudades, NUM_CIUDADES, ciudad_origen); int indice_destino = buscarIndice(ciudades, NUM_CIUDADES, ciudad_destino); // Y asi sabras en que posicion tienes que guardar esa distancia matriz_warshall[indice_origen][indice_destino] = distancia; // Y si el grafo es bidireccional: matriz_warshall[indice_destino][indice_origen] = distancia; } ... }
- Si no conoces las ciudades en tiempo de compilación (la cosa se complica un poco más)
Aquí podrás usar un struct como en el caso anterior pero no podrás inicializar el array ciudades[] estáticamente. Cada vez que leas una ciudad, tendrás que ver si ya la tienes guardada en el array y coger su índice correspondiente. En caso de no encontrarla en el array, tendrás que añadirla al final con su índice correspondiente. Hecho esto, la solución es igual al caso anterior.
|
|
|
En línea
|
cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
ayuda con cadenas
Programación Visual Basic
|
Mr pom0
|
1
|
1,502
|
4 Marzo 2008, 19:06 pm
por Chefito
|
|
|
leer cadenas de un fichero binario y mostrarlas por pantalla
Programación C/C++
|
minette1988
|
1
|
3,373
|
15 Junio 2010, 14:46 pm
por Eternal Idol
|
|
|
Ayuda con cadenas.
« 1 2 3 »
Programación C/C++
|
User
|
21
|
10,415
|
17 Julio 2012, 21:44 pm
por User
|
|
|
Ayuda, arreglo de 15 cadenas con C++
Programación C/C++
|
Kali94
|
2
|
1,887
|
27 Julio 2016, 00:51 am
por Kali94
|
|
|
ayuda con las cadenas
Programación C/C++
|
piyor6
|
8
|
3,817
|
15 Abril 2018, 03:22 am
por Kenji-chan
|
|