Existe algun comando para leer y guardar el valor de un fichero en C?

Iniciado por NAna, 3 Febrero 2019, 14:48 PM

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

NAna

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)

MAFUS

¿Has visto estructuras o sólo arrays? La solución depende de hasta dónde hayas llegado.

EdePC

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

NAna

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

MAFUS

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.

NAna

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