Autor
|
Tema: Existe algun comando para leer y guardar el valor de un fichero en C? (Leído 2,182 veces)
|
NAna
Desconectado
Mensajes: 3
|
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)
|
|
|
En línea
|
|
|
|
MAFUS
Desconectado
Mensajes: 1.603
|
¿Has visto estructuras o sólo arrays? La solución depende de hasta dónde hayas llegado.
|
|
|
En línea
|
|
|
|
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): /* 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++; }
- Una vez se tenga todo guardado el los Array (un lío que C no tenga un tipo string ) 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:\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)
|
|
|
En línea
|
|
|
|
NAna
Desconectado
Mensajes: 3
|
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);
|
|
|
En línea
|
|
|
|
MAFUS
Desconectado
Mensajes: 1.603
|
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.
|
|
|
En línea
|
|
|
|
NAna
Desconectado
Mensajes: 3
|
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) { if (i == '\0') { espai = false; } } ficher = fopen("records.txt" ,"a"); if (ficher != NULL) { if (espai) { } fprintf(ficher ,"%d-%d-%d", jugador. fecha. dia, jugador. fecha. mes, jugador. fecha. anyo); fprintf(ficher ,"%d", jugador. record); fprintf(ficher ,"%s", jugador. nombre); 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; 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; } else { } do { puntuacionMax2 = 0; ficher = fopen("records.txt" ,"r"); /* Vizualitzar la puntuació màxima */ if(ficher!=NULL) { { fscanf(ficher ,"%c",&caracters ); if(caracters == '\t') { fscanf(ficher ,"%i",&puntuacionMax ); if (puntuacionMax == MaxAnterior) if((puntuacionMax > puntuacionMax2) && (puntuacionMax != MaxAnterior)) { puntuacionMax2 = puntuacionMax; } } } } ficher = fopen("records.txt" ,"r"); /* Imprimir els records */ if (ficher != NULL) { { c = 0; caracters = '\n'; while (caracters != '\t') { fscanf(ficher , "%c", &caracters ); data[c] = caracters; c = c + 1; } fscanf(ficher , "%i", &puntuacion ); if(puntuacion == puntuacionMax2) { aux = c; c = 0; while (c < aux) { c++; } while (caracters != -1) { caracters = fgetc(ficher ); } cont = cont + 1; MaxAnterior = puntuacionMax2; if (MaxAnterior > MAXIM) { MAXIM = MaxAnterior; } } else { while (caracters != '\n') { fscanf(ficher ,"%c", &caracters ); } } } } else { } }while (cont != records-1); printf ("\n------------------------------------------------\n"); printf("Records: %i\n", records ); printf("Puntuacion max: %i\n\n", MAXIM );
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Guardar valor en un hidden para utilizar de nuevo
Desarrollo Web
|
the_sheriff_pino
|
4
|
4,895
|
22 Abril 2013, 13:28 pm
por the_sheriff_pino
|
|
|
[Bash] Ayuda con script para leer fichero
Scripting
|
scalverth
|
4
|
2,818
|
13 Febrero 2014, 11:48 am
por scalverth
|
|
|
¿Existe algún comando para acceder a un dispositivo por su ip?
Dudas Generales
|
Elalmipa_hack
|
6
|
3,736
|
1 Diciembre 2014, 15:49 pm
por Elalmipa_hack
|
|
|
Leer fichero y guardar en variables
Programación C/C++
|
Joaqqinn
|
6
|
4,752
|
13 Enero 2016, 23:43 pm
por Orubatosu
|
|
|
Map: grabar en fichero // Map: leer desde fichero.
Programación C/C++
|
gastongaston
|
0
|
1,486
|
30 Septiembre 2018, 16:03 pm
por gastongaston
|
|