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)
¿Has visto estructuras o sólo arrays? La solución depende de hasta dónde hayas llegado.
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:\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
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);
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.
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);