Error en funcion que retorna vectores en C.

Iniciado por euroesp, 28 Julio 2016, 19:34 PM

0 Miembros y 1 Visitante están viendo este tema.

euroesp

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:

#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);

   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){

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

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

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

       i2 = i-1;

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

           if (i3 == 1){

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

           if (i3 == 2){

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

           if (i3 == 3){

               fscanf(datos,"%s", &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);
           }

           if (i3 == 2){

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

           if (i3 == 3){

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

       }
   }

   return UV;

}


Gracias por adelantado.


Mod: Los códigos deben ir en etiquetas GeSHi

engel lex

Mod: Modifica el título de tu tema, las reglas el foro indican que el mismo debe ser descriptivo a la tematica
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

class_OpenGL

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);

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL

do-while

#3
Cita de: 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);

O directamente puede utilizar la función rewind(Fichero).  :xD
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!

euroesp

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.

#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.

ivancea96

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;

}


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:
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;

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

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

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

    return UV;

}


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.

class_OpenGL

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

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL

do-while

Y a fscanf le estás pasando un doble puntero a caracteres en lugar de utilizar simplemente el identificador de la cadena...
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!