Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: NAna en 3 Febrero 2019, 14:48 PM

Título: Existe algun comando para leer y guardar el valor de un fichero en C?
Publicado por: NAna en 3 Febrero 2019, 14:48 PM
Estoy teniendo problemas con el fichero para leer un valor especifico y compararlo con otro. La idea es que tengo un archivo de récords donde están guardados en cada linea la fecha, la puntuación y el nombre. Tengo que imprimir este fichero en la pantalla, lo hago con el fgetc y putchar pero el problema es que tengo que imprimirlos en orden, es decir, el primero con la puntuación más alta, luego la segunda puntuación más alta y así hasta el final. Luego tengo que imprimir la cantidad de récords imprimidos (esto lo hice con un contador) y la puntuación máxima de los récords imprimidos.

Aqui os dejo lo que tengo por ahora. (lo intente con tabla de caracteres pero no supe ni como comenzar)

system("cls");
    int i, cont_ficher, cont, num;
    int aux[20];

    FILE *ficher;
   
    cont_ficher = 0;
    cont = 0;

    printf ("\nFECHA           PUNTUACION      NOMBRE");
    printf ("\n---------------------------------------\n");



    ficher = fopen("records.txt" ,"r");           
    if (ficher != NULL)
    {
        while ((i = fgetc(ficher)) != EOF)
        {
            if (i == '\n')
            {
                cont_ficher = cont_ficher + 1;
            }
        }
        cont_ficher = cont_ficher + 1;
        fclose (ficher);
    }
    else
    {
        printf("Error");
    }

    do
    {
    ficher = fopen("records.txt" ,"r");             
    if (ficher != NULL)
    {
        while ((i = fgetc(ficher)) != EOF)
        {
            if (i == 9)
            {
                while ((i = fgetc(ficher)) != 9)
                {

                }
            }
        }
         fclose (ficher);
    }
    else
    {
        printf("Error");
    }

    ficher = fopen("records.txt" ,"r");             
    if (ficher != NULL)
    {
        while ((i = fgetc(ficher)) != EOF)
        {
            putchar(i);
        }
        cont = cont + 1;
         fclose (ficher);
    }
    else
    {
        printf("Error");
    }
    }while (cont != cont_ficher);

    printf ("\n---------------------------------------\n");
    printf ("");



Tambien os dejo el fichero:

3-2-2019   39000      NOMBRE
3-2-2019   21000      NOMBRE               (Estan separados por tabulaciones)
3-2-2019   18000      NOMBRE               (FECHA \t  PUNTUACION \t\t NOMBRE)
Título: Re: Existe algun comando para leer y guardar el valor de un fichero en C?
Publicado por: MAFUS en 3 Febrero 2019, 19:03 PM
¿Has visto estructuras o sólo arrays? La solución depende de hasta dónde hayas llegado.
Título: Re: Existe algun comando para leer y guardar el valor de un fichero en C?
Publicado por: EdePC en 3 Febrero 2019, 19:48 PM
Saludos,

- Me ha ayudado enormemente este e-book gratuito en español:
https://openlibra.com/es/book/introduccion-a-la-programacion-con-c-3

- En mi caso lo he hecho con puro Array (muestro extracto):

#define MAX_FILAS   50
#define TAM_FECHA   11
#define TAM_NOMBRE  50

int main() {

  char fechas[MAX_FILAS][TAM_FECHA];
  int  puntajes[MAX_FILAS];
  char nombres[MAX_FILAS][TAM_NOMBRE];


- Para leer los datos del fichero, me pareció más cómodo hacerlo con fscanf (muestro estracto):

  printf("Fichero leido: \n");

/* Lee el fichero y guarda los registros */
  while ( feof(file) == 0 ) {
    fscanf(file, "%s%d%s", fechas[cont], &puntajes[cont], nombres[cont]);
    printf("%s | %d | %s\n", fechas[cont], puntajes[cont], nombres[cont]);
    cont++;
  }
  fclose(file);


- Una vez se tenga todo guardado el los Array (un lío que C no tenga un tipo string :xD) se procede a ordenarlo, en el e-book está el método de ordenamiento Burbuja ejemplificado, se tiene que hacer uso de Arrays auxiliares y eso. Pero no se pueden copiar Array a otro Array directamente, se tiene que usar strncpy(array_destino, array_origen, cantidad_de_elementos), esto también está teorizado y ejemplificado en el e-book, muestro extracto que solo ordena el puntaje y la fecha, también debes ordenar el nombre:

/* Ordenacion mediante metodo Burbuja*/
  for ( int i = 0; i < cont - 1; i++ ) {
    for ( int j = 0; j < cont - 1; j++ ) {
      if ( puntajes[j] < puntajes[j + 1] ) {
        strncpy(aux_fechas, fechas[j], TAM_FECHA);
        aux_puntajes = puntajes[j];

        strncpy(fechas[j], fechas[j + 1], TAM_FECHA);
        puntajes[j] = puntajes[j + 1];

        strncpy(fechas[j + 1], aux_fechas, TAM_FECHA);
        puntajes[j + 1] = aux_puntajes;
      }
    }
  }


- Al final solo queda mostrar los resultados que piden, cantidad de líneas leídas (cant), puntaje más alto (puntajes[0]) y usar un FOR para mostrar todos los registros ordenados, muestro salida del programa ordenado:

Código (dos) [Seleccionar]
C:\Users\EdSon\Desktop>type read_file.txt
3-2-2019   21000      NOMBRE
3-2-2019   39000      NOMBRE
3-2-2019   18000      NOMBRE
C:\Users\EdSon\Desktop>gcc read_file.c -o read_file.exe && read_file.exe
Fichero leido:
3-2-2019 | 21000 | NOMBRE
3-2-2019 | 39000 | NOMBRE
3-2-2019 | 18000 | NOMBRE

Total lineas leidas: 3
Puntaje mas alto: 39000
Fichero ordenado:
3-2-2019 | 39000 | NOMBRE
3-2-2019 | 21000 | NOMBRE
3-2-2019 | 18000 | NOMBRE

C:\Users\EdSon\Desktop>


- Ahora solo te toca encajar todo el código y listo (buen ejercicio) :P
Título: Re: Existe algun comando para leer y guardar el valor de un fichero en C?
Publicado por: NAna en 3 Febrero 2019, 23:22 PM
Perdón por no contestar antes. El problema que tengo es que las fechas, los puntuajes y los nombres los guardé a partir de unos registros.

A esto me refiero:

bool guardat, espai;
    char i;

    FILE *ficher;
    guardat = false;
    espai = true;

    ficher = fopen("records.txt" ,"r");
    if (ficher != NULL)
    {
        fscanf (ficher, "%c", &i);
        if (i == '\0')
        {
            espai = false;
        }
        fclose(ficher);
    }


    ficher = fopen("records.txt" ,"a");
    if (ficher != NULL)
    {
        if (espai)
        {
            fprintf(ficher, "\n");
        }
        fprintf(ficher,"%d-%d-%d", jugador.fecha.dia, jugador.fecha.mes, jugador.fecha.anyo);
        fprintf (ficher, "\t");

        fprintf(ficher,"%d", jugador.record);
        fprintf (ficher, "\t");

        fprintf(ficher,"%s", jugador.nombre);
        printf ("\n");

        fclose (ficher);
        guardat = true;
    }
    else
    {
        return guardat;
    }
    return guardat;


Por ahora he ido avanzando y tengo todo esto pero me sigue fallando en imprimir las cosas y esto me vuelve loco:


int MaxAnterior = 0;
    int puntuacionMax = 0;
    int puntuacionMax2 = 0;
    int puntuacion = 0;
    char caracters;
    int records = 0;
    int cont = 0;
    int i, c, aux;
    char data[20];
    int MAXIM = 0;

    FILE *ficher;

    system("cls");
    c = 0;

    printf ("\nFECHA                   PUNTUACION      NOMBRE");
    printf ("\n------------------------------------------------");



    ficher = fopen("records.txt" ,"r");                 /* Contador de records */
    if (ficher != NULL)
    {
        while ((i = fgetc(ficher)) != EOF)
        {
            if (i == '\n')
            {
                records = records + 1;
            }
        }
        records = records + 1;
        fclose (ficher);
    }
    else
    {
        printf("Error");
    }

do
{
    puntuacionMax2 = 0;
    ficher = fopen("records.txt" ,"r");              /* Vizualitzar la puntuació màxima */
    if(ficher!=NULL)
    {
        while(!feof(ficher))
        {
            fscanf(ficher,"%c",&caracters);
            if(caracters == '\t')
            {
                fscanf(ficher,"%i",&puntuacionMax);
                if (puntuacionMax == MaxAnterior)
                if((puntuacionMax > puntuacionMax2) && (puntuacionMax != MaxAnterior))
                {
                    puntuacionMax2 = puntuacionMax;
                }
                fscanf(ficher, "\n");
            }
        }
        fclose(ficher);
    }


    ficher = fopen("records.txt" ,"r");             /* Imprimir els records */
    if (ficher != NULL)
    {
        while(!feof(ficher))
        {
        c = 0;
        caracters = '\n';
        while (caracters != '\t')
        {
            fscanf(ficher, "%c", &caracters);
            data[c] = caracters;
            c = c + 1;
        }
        fscanf (ficher, "\t");
        fscanf(ficher, "%i", &puntuacion);
        if(puntuacion == puntuacionMax2)
        {
            aux = c;
            c = 0;
            printf ("\n");
            while (c < aux)
            {
                printf("%c",data[c]);
                c++;
            }
            printf ("%i" ,puntuacion);
            printf ("\t");
            while (caracters != -1)
            {
                caracters = fgetc(ficher);
                printf ("%c", caracters);
            }
            cont = cont + 1;
            MaxAnterior = puntuacionMax2;
            if (MaxAnterior > MAXIM)
            {
                MAXIM = MaxAnterior;
            }
        }
        else
        {
            while (caracters != '\n')
            {
                fscanf(ficher,"%c", &caracters);
            }
        }
        }
        fclose (ficher);
    }
    else
    {
        printf("Error");
    }
}while (cont != records-1);


    printf ("\n------------------------------------------------\n");
    printf("Records: %i\n", records);
    printf("Puntuacion max: %i\n\n", MAXIM);
Título: Re: Existe algun comando para leer y guardar el valor de un fichero en C?
Publicado por: MAFUS en 4 Febrero 2019, 00:14 AM
Por favor, usa la lista desplegable GeSHi para elegir el lenguaje de tu código. Cuando aparezcan las dos etiquetas pegas el código en medio de ellas.
Título: Re: Existe algun comando para leer y guardar el valor de un fichero en C?
Publicado por: NAna en 4 Febrero 2019, 00:38 AM
Lo siento es que soy nuevo aquí.

Aquí lo tenéis.


bool guardat, espai;
    char i;

    FILE *ficher;
    guardat = false;
    espai = true;

    ficher = fopen("records.txt" ,"r");
    if (ficher != NULL)
    {
        fscanf (ficher, "%c", &i);
        if (i == '\0')
        {
            espai = false;
        }
        fclose(ficher);
    }


    ficher = fopen("records.txt" ,"a");
    if (ficher != NULL)
    {
        if (espai)
        {
            fprintf(ficher, "\n");
        }
        fprintf(ficher,"%d-%d-%d", jugador.fecha.dia, jugador.fecha.mes, jugador.fecha.anyo);
        fprintf (ficher, "\t");

        fprintf(ficher,"%d", jugador.record);
        fprintf (ficher, "\t");

        fprintf(ficher,"%s", jugador.nombre);
        printf ("\n");

        fclose (ficher);
        guardat = true;
    }
    else
    {
        return guardat;
    }
    return guardat;


Por ahora he ido avanzando y tengo todo esto pero me sigue fallando en imprimir las cosas y esto me vuelve loco:


int MaxAnterior = 0;
    int puntuacionMax = 0;
    int puntuacionMax2 = 0;
    int puntuacion = 0;
    char caracters;
    int records = 0;
    int cont = 0;
    int i, c, aux;
    char data[20];
    int MAXIM = 0;

    FILE *ficher;

    system("cls");
    c = 0;

    printf ("\nFECHA                   PUNTUACION      NOMBRE");
    printf ("\n------------------------------------------------");



    ficher = fopen("records.txt" ,"r");                 /* Contador de records */
    if (ficher != NULL)
    {
        while ((i = fgetc(ficher)) != EOF)
        {
            if (i == '\n')
            {
                records = records + 1;
            }
        }
        records = records + 1;
        fclose (ficher);
    }
    else
    {
        printf("Error");
    }

do
{
    puntuacionMax2 = 0;
    ficher = fopen("records.txt" ,"r");              /* Vizualitzar la puntuació màxima */
    if(ficher!=NULL)
    {
        while(!feof(ficher))
        {
            fscanf(ficher,"%c",&caracters);
            if(caracters == '\t')
            {
                fscanf(ficher,"%i",&puntuacionMax);
                if (puntuacionMax == MaxAnterior)
                if((puntuacionMax > puntuacionMax2) && (puntuacionMax != MaxAnterior))
                {
                    puntuacionMax2 = puntuacionMax;
                }
                fscanf(ficher, "\n");
            }
        }
        fclose(ficher);
    }


    ficher = fopen("records.txt" ,"r");             /* Imprimir els records */
    if (ficher != NULL)
    {
        while(!feof(ficher))
        {
        c = 0;
        caracters = '\n';
        while (caracters != '\t')
        {
            fscanf(ficher, "%c", &caracters);
            data[c] = caracters;
            c = c + 1;
        }
        fscanf (ficher, "\t");
        fscanf(ficher, "%i", &puntuacion);
        if(puntuacion == puntuacionMax2)
        {
            aux = c;
            c = 0;
            printf ("\n");
            while (c < aux)
            {
                printf("%c",data[c]);
                c++;
            }
            printf ("%i" ,puntuacion);
            printf ("\t");
            while (caracters != -1)
            {
                caracters = fgetc(ficher);
                printf ("%c", caracters);
            }
            cont = cont + 1;
            MaxAnterior = puntuacionMax2;
            if (MaxAnterior > MAXIM)
            {
                MAXIM = MaxAnterior;
            }
        }
        else
        {
            while (caracters != '\n')
            {
                fscanf(ficher,"%c", &caracters);
            }
        }
        }
        fclose (ficher);
    }
    else
    {
        printf("Error");
    }
}while (cont != records-1);


    printf ("\n------------------------------------------------\n");
    printf("Records: %i\n", records);
    printf("Puntuacion max: %i\n\n", MAXIM);