Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: euroesp en 28 Julio 2016, 19:34 pm



Título: Error en funcion que retorna vectores en C.
Publicado por: euroesp en 28 Julio 2016, 19:34 pm
Buenas,

Estoy haciendo un programa que primero me diga cuantas lineas tiene el archivo (se trata de un archivo con tres columnas y alrededor de 300.000 lineas) y luego me cree un vector en el que me escriba los términos de la segunda columna y otro con los términos de la tercera columna (la segunda columna son ints y la tercera long doubles). El problema es que todo funciona correctamente pero cuando le pido que me escriba las componentes de los vectores, me escribe "0" en todas, como si no estuviera leyendo nada. ¿Podrian ayudarme?

Les adjunto el codigo:

Código
  1. #include <stdio.h>
  2. #include <math.h>
  3. #include <stdlib.h>
  4.  
  5. #define dim 10
  6. #define dim2 10000
  7.  
  8. int contarlineas (FILE *datos);
  9. double* vectorizaciont (FILE *datos, int lineas);
  10. double* vectorizacionUV (FILE *datos, int lineas);
  11.  
  12.  
  13. int main(){
  14.  
  15.    int lineas;
  16.    double *t;
  17.    long double *UV;
  18.  
  19.    FILE* datos = NULL;
  20. datos = fopen("00_10_01_01.00.00_._00_11_30_23.00.00_.txt", "r");
  21.  
  22.    lineas = contarlineas(datos);
  23.  
  24.    t = malloc(lineas*sizeof(double));
  25.    UV = malloc(lineas*sizeof(long double));
  26.  
  27.    t = vectorizaciont(datos,lineas);
  28.    UV = vectorizacionUV(datos,lineas);
  29.  
  30.  
  31. return 0;
  32.  
  33. }
  34.  
  35. int contarlineas (FILE *datos){
  36.  
  37.    int lineas = 0;
  38.    char aux[dim2] = "";
  39.  
  40.     while (!feof(datos)){
  41.  
  42.              lineas++;
  43.  fscanf(datos, " %[^\n]", &aux);
  44.  
  45.    }
  46.  
  47.    return lineas;
  48.  
  49.    }
  50.  
  51. double* vectorizaciont (FILE *datos, int lineas){
  52.  
  53.    int *t;
  54.    char aux[dim2] = "";
  55.    int i,i2,i3;
  56.  
  57.    t = malloc(lineas*sizeof(int));
  58.  
  59.    for (i=1;i<=lineas;i++){
  60.  
  61.        i2 = i-1;
  62.  
  63.        for(i3=1;i3<=3;i3++){
  64.  
  65.            if (i3 == 1){
  66.  
  67.                fscanf(datos, "%s", &aux);
  68.            }
  69.  
  70.            if (i3 == 2){
  71.  
  72.                fscanf(datos,"%i", &t[i2]);
  73.                printf("t[%i] = %i \n", i2, t[i2]);
  74.            }
  75.  
  76.            if (i3 == 3){
  77.  
  78.                fscanf(datos,"%s", &aux);
  79.            }
  80.  
  81.        }
  82.    }
  83.  
  84.    return t;
  85. }
  86.  
  87. double* vectorizacionUV (FILE *datos, int lineas){
  88.  
  89.    long double *UV;
  90.    char aux[dim2] = "", aux2[dim2] = "";
  91.    int i,i2,i3;
  92.  
  93.    UV = malloc(lineas*sizeof(long double));
  94.  
  95.    for (i=1;i<=lineas;i++){
  96.  
  97.        i2 = i-1;
  98.  
  99.        for(i3=1;i3<=3;i3++){
  100.  
  101.            if (i3 == 1){
  102.  
  103.                fscanf(datos,"%s", &aux);
  104.            }
  105.  
  106.            if (i3 == 2){
  107.  
  108.                fscanf(datos,"%s", &aux);
  109.            }
  110.  
  111.            if (i3 == 3){
  112.  
  113.                fscanf(datos,"%lf", &aux2);
  114.                printf("UV[%i] = %lf \n", i2, UV[i2]);
  115.            }
  116.  
  117.        }
  118.    }
  119.  
  120.    return UV;
  121.  
  122. }

Gracias por adelantado.


Mod: Los códigos deben ir en etiquetas GeSHi


Título: Re: Problema programacion en C.
Publicado por: engel lex en 28 Julio 2016, 21:08 pm
Mod: Modifica el título de tu tema, las reglas el foro indican que el mismo debe ser descriptivo a la tematica


Título: Re: Problema programacion en C.
Publicado por: class_OpenGL en 29 Julio 2016, 09:19 am
Solo voy a indicar el fallo, aunque veo algunas cosas que se podrían optimizar. El fallo es que al contar las líneas, ya has leído el archivo, por lo que cuando vas a tomar los datos enteros, no lees nada porque ya has leído el archivo. Para reiniciar la lectura del archivo, usa la siguiente función: fseek(apuntador_archivo, 0, SEEK_SET);


Título: Re: Problema programacion en C.
Publicado por: do-while en 29 Julio 2016, 09:37 am
Solo voy a indicar el fallo, aunque veo algunas cosas que se podrían optimizar. El fallo es que al contar las líneas, ya has leído el archivo, por lo que cuando vas a tomar los datos enteros, no lees nada porque ya has leído el archivo. Para reiniciar la lectura del archivo, usa la siguiente función: fseek(apuntador_archivo, 0, SEEK_SET);

O directamente puede utilizar la función rewind(Fichero) (http://www.cplusplus.com/reference/cstdio/rewind/).  :xD


Título: Re: Error en funcion que retorna vectores en C.
Publicado por: euroesp en 29 Julio 2016, 12:35 pm
Buenas,

Antes de nada agradecerles sus aportes y el tiempo que han dedicado a mi problema. El caso es que he probado con el fseek y con el rewind pero el problema persiste, incluso quitando la funcion "contarlineas" y dando a lineas un valor fijo, sigue devolviendo ceros.

Les adjunto el codigo nuevo.

Código:
#include <stdio.h>
#include <math.h>
#include <stdlib.h>

#define dim 10
#define dim2 10000

int contarlineas (FILE *datos);
double* vectorizaciont (FILE *datos, int lineas);
double* vectorizacionUV (FILE *datos, int lineas);


int main(){

    int lineas;
    double *t;
    long double *UV;

    FILE* datos = NULL;
datos = fopen("00_10_01_01.00.00_._00_11_30_23.00.00_.txt", "r");

    lineas = contarlineas(datos);

    rewind(datos);

    t = malloc(lineas*sizeof(double));
    UV = malloc(lineas*sizeof(long double));

    t = vectorizaciont(datos,lineas);
    UV = vectorizacionUV(datos,lineas);


 return 0;

}

int contarlineas (FILE *datos){

    int lineas = 0;
    char aux[dim2] = "";

     while (!feof(datos)){

              lineas++;
  fscanf(datos, " %[^\n]", &aux);

    }

    return lineas;

    }

double* vectorizaciont (FILE *datos, int lineas){

    double *t;
    char aux[dim2] = "";
    int i,i2,i3;

    t = malloc(lineas*sizeof(double));

    for (i=1;i<=lineas;i++){

        i2 = i-1;

        for(i3=1;i3<=3;i3++){

            if (i3 == 1){

                fscanf(datos, "%s", &aux);
                free(aux);
            }

            if (i3 == 2){

                fscanf(datos,"%f", &t[i2]);
                printf("t[%i] = %f \n", i2, t[i2]);
            }

            if (i3 == 3){

                fscanf(datos,"%s", &aux);
                free(aux);
            }

        }
    }

    return t;
}

double* vectorizacionUV (FILE *datos, int lineas){

    long double *UV;
    char aux[dim2] = "", aux2[dim2] = "";
    int i,i2,i3;

    UV = malloc(lineas*sizeof(long double));

    for (i=1;i<=lineas;i++){

        i2 = i-1;

        for(i3=1;i3<=3;i3++){

            if (i3 == 1){

                fscanf(datos,"%s", &aux);
                free(aux);
            }

            if (i3 == 2){

                fscanf(datos,"%s", &aux);
                free(aux);
            }

            if (i3 == 3){

                fscanf(datos,"%lf", &aux2);
                printf("UV[%i] = %lf \n", i2, UV[i2]);
            }

        }
    }

    return UV;

}

Gracias por su tiempo.


Título: Re: Error en funcion que retorna vectores en C.
Publicado por: ivancea96 en 29 Julio 2016, 14:42 pm
Código
  1. double* vectorizacionUV (FILE *datos, int lineas){
  2.  
  3.    long double *UV;
  4.    char aux[dim2] = "", aux2[dim2] = "";
  5.    int i,i2,i3;
  6.  
  7.    UV = malloc(lineas*sizeof(long double));
  8.  
  9.    for (i=1;i<=lineas;i++){
  10.  
  11.        i2 = i-1;
  12.  
  13.        for(i3=1;i3<=3;i3++){
  14.  
  15.            if (i3 == 1){
  16.  
  17.                fscanf(datos,"%s", &aux);
  18.                free(aux);
  19.            }
  20.  
  21.            if (i3 == 2){
  22.  
  23.                fscanf(datos,"%s", &aux);
  24.                free(aux);
  25.            }
  26.  
  27.            if (i3 == 3){
  28.  
  29.                fscanf(datos,"%lf", &aux2);
  30.                printf("UV[%i] = %lf \n", i2, UV[i2]);
  31.            }
  32.  
  33.        }
  34.    }
  35.  
  36.    return UV;
  37.  
  38. }

Un par e cosas ahí. en primer lugar, no hagas esos free(aux). aux no tiene es memoria dinámica.
Luego, ese for e ifs son innecesarios:
Código
  1. double* vectorizacionUV (FILE *datos, int lineas){
  2.  
  3.    long double *UV;
  4.    char aux[dim2] = "", aux2[dim2] = "";
  5.    int i,i2,i3;
  6.  
  7.    UV = malloc(lineas*sizeof(long double));
  8.  
  9.    for (i=1;i<=lineas;i++){
  10.  
  11.        i2 = i-1;
  12.  
  13.        fscanf(datos,"%s", &aux);
  14.  
  15.        fscanf(datos,"%s", &aux);
  16.  
  17.        fscanf(datos,"%lf", &aux2);
  18.        printf("UV[%i] = %lf \n", i2, UV[i2]);
  19.    }
  20.  
  21.    return UV;
  22.  
  23. }

Luego, ese último printf saca por pantalla UV[i2]. ¿Dónde le asignas un valor a UV[i2]?

Por último, puedes prescindir de aux2. Puedes usar aux en la tercera parte.

Lo mismo se aplica para la otra función, vectorizaciont.


Título: Re: Error en funcion que retorna vectores en C.
Publicado por: class_OpenGL en 29 Julio 2016, 14:57 pm
La función 'vectorizaciont' retorna un puntero a double, mientras que debería retornar un puntero a entero. Además, el rewind o fseek lo tienes que hacer también de leer los enteros


Título: Re: Error en funcion que retorna vectores en C.
Publicado por: do-while en 29 Julio 2016, 16:17 pm
Y a fscanf le estás pasando un doble puntero a caracteres en lugar de utilizar simplemente el identificador de la cadena...