elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Ayuda con fichero y cadenas en C
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Ayuda con fichero y cadenas en C  (Leído 4,556 veces)
luar79

Desconectado Desconectado

Mensajes: 12


Ver Perfil
Ayuda con fichero y cadenas en C
« en: 4 Mayo 2022, 19:49 pm »

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:
Código
  1. char * campo;
  2.    char ** datos;
  3.    int filas=0;
  4.    int MaxLinea=maxLinea;
  5.    char lineaFinal[maxLinea];
  6.    char linea[maxLinea];
  7.    datos=malloc(sizeof(char*)*1);
  8.    datos=malloc(sizeof(char)*3);
  9.  
  10.    // se lee cada fila de todo el fichero de elementos
  11.    while(fgets(linea,MaxLinea,fichero) >0 )
  12.    {
  13.            strcpy(lineaFinal[filas],linea);
  14.            filas++;
  15.            datos=realloc(datos,sizeof(char*)*filas);
  16.    }
  17.  
  18.    for(int i=0; i<filas; i++)
  19.    {
  20.        datos=realloc (datos,sizeof(char)*3);
  21.    }
  22.  
  23.    for(int i=0; i<filas; i++)
  24.    {
  25.        for(int j=0; j<3; j++)
  26.  
  27.        {
  28.            campo = strtok(lineaFinal[filas], " ");
  29.            datos[i][j]=campo;
  30.            campo=strtok(NULL," ");
  31.            datos[i][j]=campo;
  32.            campo=strtok(NULL," ");
  33.            datos[i][j]=campo
  34.        }
  35.    }
  36.  

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
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: Ayuda con fichero y cadenas en C
« Respuesta #1 en: 4 Mayo 2022, 22:52 pm »

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:
Código
  1. const MAX_LONGITUD_CIUDAD= 50;
  2.  
  3. int main() {
  4.    char ciudad1[MAX_LONGITUD_CIUDAD];
  5.    char ciudad2[MAX_LONGITUD_CIUDAD];
  6.    float kms;
  7.  
  8.    FILE *f = fopen("fichero.txt", "r");
  9.    while(fscanf(f, "%s %s %f", ciudad1, ciudad2, &kms) == 3) { // fscanf devuelve el numero de variables que ha asignado correctamente, en este caso 3
  10.        printf("La ciudad 1 es: %s\n", ciudad1);
  11.        printf("La ciudad 2 es: %s\n", ciudad2);
  12.        printf("Los kms entre ellas son: %.2f km\n", kms);
  13.    }
  14.  
  15.    // 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:
  16.    getchar(); // getchar() espera a que pulses una tecla. Una vez pulsada cualquier tecla, el programa se cerrara
  17. }

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:
Código
  1. struct Ruta {
  2.    char *ciudad1;
  3.    char *ciudad2,
  4.    float distancia;
  5. }
Y utilizar un Ruta[] para guardar todas las líneas del fichero. Más correcto que un char[][].


En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Ayuda con fichero y cadenas en C
« Respuesta #2 en: 4 Mayo 2022, 23:14 pm »

Otra cosa que no se recomienda es que un realloc se realice sobre la misma variable, es decir:
Código:
datos=realloc(datos,sizeof(char*)*filas)
En línea

luar79

Desconectado Desconectado

Mensajes: 12


Ver Perfil
Re: Ayuda con fichero y cadenas en C
« Respuesta #3 en: 5 Mayo 2022, 14:18 pm »

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
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: Ayuda con fichero y cadenas en C
« Respuesta #4 en: 7 Mayo 2022, 17:56 pm »

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)
Código
  1. typedef struct {
  2.  int indice;
  3.  char *nombre;
  4. } Ciudad;
  5.  
  6. const int NUM_CIUDADES = 3;
  7.  
  8. int main() {
  9.  Ciudad ciudades[NUM_CIUDADES] = { // NUM_CIUDADES aqui es opcional
  10.    {0, "Ciudad 1"},
  11.    {1, "Ciudad 2"},
  12.    {2, "Ciudad 3"}
  13.  };
  14.  
  15.  float matriz_warshall[NUM_CIUDADES][NUM_CIUDADES];
  16.  
  17.  while(fscanf(f, "%s %s %f", ciudad_origen, ciudad_destino, distancia) === 3) {
  18.    // Cada vez que leas una linea, tienes que buscar a que indices corresponden esas ciudades
  19.    int indice_origen = buscarIndice(ciudades, NUM_CIUDADES, ciudad_origen);
  20.    int indice_destino = buscarIndice(ciudades, NUM_CIUDADES, ciudad_destino);
  21.    // Y asi sabras en que posicion tienes que guardar esa distancia
  22.    matriz_warshall[indice_origen][indice_destino] = distancia;
  23.    // Y si el grafo es bidireccional:
  24.    matriz_warshall[indice_destino][indice_origen] = distancia;
  25.  }
  26.  ...
  27. }

  • 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

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
ayuda con cadenas
Programación Visual Basic
Mr pom0 1 1,512 Último mensaje 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,403 Último mensaje 15 Junio 2010, 14:46 pm
por Eternal Idol
Ayuda con cadenas. « 1 2 3 »
Programación C/C++
User 21 10,592 Último mensaje 17 Julio 2012, 21:44 pm
por User
Ayuda, arreglo de 15 cadenas con C++
Programación C/C++
Kali94 2 1,916 Último mensaje 27 Julio 2016, 00:51 am
por Kali94
ayuda con las cadenas
Programación C/C++
piyor6 8 3,858 Último mensaje 15 Abril 2018, 03:22 am
por Kenji-chan
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines