Duda con programación en C

Hola a todos.

Tengo que pasar unas palabras que hay en un fichero de texto a un vector dinámico de carácteres. La estructura del fichero de texto es numero_palabra (ej. 1_hola). Estoy intentandolo haciendo esto:

   
        FILE *f;
   int lectura1;
   char lectura2[TAM];
   int i=0;

   if((f=fopen(fichero, "r"))==NULL){
          fprintf(stderr, "\nError: no pudo abrirse fichero <%s>", fichero);
          exit(-1);
       }
 
       for(i=0;i<numeroPalabras;i++){
       while(fscanf(f, "%d_%s", &lectura1, lectura2)==2)        
          strcpy(vector[i],lectura2);       
       }
   
   
  }
 
  fclose(f);


Para reservar el vector hago

void reservaVector(){
   
   char* vector;
 
  if((vector=(char*)malloc(TAM*sizeof(char)))==NULL)
  {
     printf("Error: no pudo asignarse memoria\n");
     exit(-1);
  }
 
}


Pero así solo me pasa la primera palabra a vector[0]... Con las demás no hace nada. La palabra se almacena bien en lectura2, lo que me falla es al pasarlo al vector dinámico.

Una mano plis [sonrisa]
Deberías enseñar algo más de código.... pero, así a bote pronto, el calculo de longitud del vector, está mal.

- ferdy
Bueno, el codigo entero es este:

#define TAM 60
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "ejercicio2.h"

void main(int argc, char* argv[]){
    
     int nArgumentos=argc;
     char* vector;
    
    comprobarParametros(nArgumentos);
   
    char* nombreF=argv[1];
   
    if(existeFichero(nombreF)==0){
       puts("El fichero de diccionario no existe");
       exit(-1);
    }
   
    int numeroPalabras=(atoi(argv[5]));
       
    if(comprobarPalabras(nombreF)<numeroPalabras){
       puts("No hay tantas palabras en el archivo diccionario");
       exit(-1);
    }
   
    reservaVector();
    rellenaVector(nombreF,vector,numeroPalabras);

}

void reservaVector(){
   
   char* vector;
 
  if((vector=(char*)malloc(TAM*sizeof(char)))==NULL)
  {
     printf("Error: no pudo asignarse memoria\n");
     exit(-1);
  }
 
}

void rellenaVector(char* nombreF, char* vector, int numeroPalabras){
   
   FILE *f;
   int lectura1;
   char lectura2[TAM];
   int i=0;

   if((f=fopen(nombreF, "r"))==NULL){
     fprintf(stderr, "\nError: no pudo abrirse fichero <%s>", nombreF);
     exit(-1);
  }
 
  for(i=0;i<numeroPalabras;i++){
     while(fscanf(f, "%d_%s", &lectura1, lectura2)==2){
        
        strcpy(vector[i],lectura2);
       
    }
   
   
   
  }
 
  fclose(f);
}

void comprobarParametros(int nArgumentos){
   
    if(nArgumentos!=6){ /*Comprobacion de que el programa ha sido llamado correctamente*/
       printf("Llamada al programa incorrecta\n");
       printf("Uso: generador.exe archivodiccionario ficheroalmacenamiento nFilas nColumnas nPalabras\n");
       exit(-1);
     
    }

}

int existeFichero(char *nombreF){
   
    FILE *f;

     f=fopen(nombreF, "r"); /*Abre el fichero en modo lectura*/
   
    if(f==NULL){
       return 0; /*Si el fichero no existe devuelve 0*/
    }
   
    else{ /*Si el fichero existe lo cierra y devuelve 1*/
       fclose (f);
       return 1;
    }
}

int comprobarPalabras(char *nombreF){
   
     FILE* f;
     int lectura1;
     char lectura2[TAM];
     int salir=0;
     int contar=0;
     int contador=0;
    
     if((f=fopen(nombreF, "r"))==NULL){ /*Abre el fichero en modo lectura*/
      fprintf(stderr, "\nError: no pudo abrirse fichero <%s>", nombreF);
      exit(-1);
    }
   
    while(salir==0){ /*Mientras la variable salir valga 0 sigue leyendo*/
      contar=fscanf(f, "%d_%s", &lectura1, lectura2); /*Lee el fichero*/
      if(contar==2) /*Si lee dos variables suma uno a la variable contador*/
         contador++;
       else /*Si no lee dos variables (fin de fichero) el bucle while termina*/
         salir=1;
       
    }
   
    return contador;
   
    fclose(f);
}


El codigo primero comprueba que se ha llamado al programa correctamente y luego pasa las palabras al vector de cadenas de caracteres.

A que te refieres con el calculo de longitud del vector?

Muchas gracias Ferdy.
Fallo número 1: reservaVector no está haciendo lo que crees, fíjate bien en esa función.

- ferdy
Lo único que se me ocurre es:

char* reservaVector(){
   
   char* vector;
 
  if((vector=(char*)malloc(TAM*sizeof(char)))==NULL)
  {
     printf("Error: no pudo asignarse memoria\n");
     exit(-1);
  }
 
  return (vector);
 
}


y en el main

     char* vector;
     vector=reservaVector();


No caigo con otra cosa... estaré espeso ahora mismo, despues de cenar miraré otra vez a ver que se me ocurre.

Gracias Ferdy ;)
Eso está mejor. El cálculo del tamaño del vector sigue estando mal, mira que reservas memoria para 60 caracteres... diría que no es eso lo que quieres.

- ferdy
Supongo que eso se arreglaría reservando una matriz por filas en vez de un vector... el caso es que el ejercicio dice vector de cadena de caracteres... en fin, a ver que se me ocurre.

Gracias de nuevo, no me había dado cuenta de ese detalle [ginyo]
Quizas por "vector de cadenas de caracteres" se refiera a "Array de punteros a caracter donde inicia cada una de las palabras".
Sertinell escribió:Quizas por "vector de cadenas de caracteres" se refiera a "Array de punteros a caracter donde inicia cada una de las palabras".


Me dejas igual que estaba jajaja. No creo que sea así porque no me suena de nada haber dado algo de eso en clase...

Lo haré con una matriz porque no tengo ni puta idea de como hacerlo de otra forma.

Gracias

EDITO: Lo conseguí xD Se me han caido un par de lagrimones...

Hice un:

typedef char Cadena[TAM+1];


Reserva:

char* reservaVector(int numeroPalabras){
   
   Cadena* vector;
 
  if((vector=(Cadena*)malloc(numeroPalabras*sizeof(Cadena)))==NULL)
  {
     printf("Error: no pudo asignarse memoria\n");
     exit(-1);
  }
 
  return (vector);
 
}


Y relleno del vector:

void rellenaVector(char* nombreF, char* vector, int numeroPalabras){
   
   FILE *f;
   int lectura;
   int lectura1;
   char lectura2[TAM];
   int i=0;

   if((f=fopen(nombreF, "r"))==NULL){
     fprintf(stderr, "\nError: no pudo abrirse fichero <%s>", nombreF);
     exit(-1);
  }
 
  for(i=0;i<numeroPalabras;i++){
     if(lectura=fscanf(f, "%d_%s", &lectura1, lectura2)==2){        
        strcpy(vector[i],lectura2);       
       printf("Palabra --> %s\n",lectura2);
    }
  }
 
  fclose(f);
}


Está correcto este código? Funcionar funciona...
Está bien a medias, reservaVector no debería devolver char*

- ferdy
Me dí cuenta al ponerlo aquí y lo cambié jeje.

Gracias
10 respuestas