PDA

Visualizza la versione completa : [C] Problema con la scrittura su file


Shikamaru93
30-05-2013, 00:33
Questo programma dovrebbe leggere da un file di testo, diversi dati. In particolare, deve leggere la prima riga che corrisponde al numero di dati contenuti nel file e poi fare le varie operazioni. Bisogna prendere dei tempi da una classifica di formula1, convertirli in secondi (ho preferito farlo così) e stampare questi dati su un altro file di testo, ordinandoli però dal più basso al più alto.



#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct corridore{
char nome[200];
char naz [4];
char sqd[4];
int time;
};

void ordina(struct corridore *classifica, int num){
int i, j;
struct corridore temp;
for (i=(num-1); i>0; i--){
for (j=1; j<=i; j++){
if (classifica [j-1].time > classifica[j].time){
temp=classifica[j-1];
classifica[j-1] = classifica[j];
classifica[j] = temp;
}
}
}

}

int main(int argc, char *argv[]){
FILE *fin, *fout;
char buf [2048];
int num;
int i=0;
int h=0, m=0, s=0;
fin = fopen (argv[1], "r");
fout = fopen (argv[2], "w");

fgets (buf, sizeof(buf), fin); /*Legge la prima riga che indica quanti partecipanti in gara*/
num = atoi(buf);
struct corridore *classifica = malloc(sizeof(struct corridore) *num);
if (classifica == NULL){
printf("Rilevato errore nella classifica\n");
return -1;
}

while (fgets (buf,sizeof(buf), fin) != NULL){
strcpy (classifica[i].nome, strtok(buf, ",")); /*Mette in nome, l'i*esimo nome da tok*/
strcpy (classifica[i].naz, strtok(NULL, ",")); /*Mette in naz, l'i*esimo nome da tok*/
strcpy (classifica[i].sqd, strtok(NULL, ",")); /*Mette in sqd, l'i*esimo nome da tok*/

{h = atoi(strtok(NULL, ":"));
m = atoi(strtok(NULL, ":"));
s = atoi(strtok(NULL, ":"));

classifica[i].time = (h*3600 + m*60 + s); /*Mette in time il tempo calcolato in secondi*/
}

ordina(classifica, num);

fprintf(fout, "%s %ds\n", buf,corridore classifica[i].time);

}
fclose(fin);
fclose(fout);
return 0;
}

Se per esempio gli faccio leggere il file con la classifica con 20 dati inseriti, questo mi stampa sull'altro file il nome del corridore (come dovrebbe fare) e accanto a lui uno 0 che dovrebbe essere il tempo convertito in secondi a parte per l'ultimo della lista che lo converte come dovrebbe e mi stampa il suo valore.
Perchè fa questo? Non capisco cosa sbaglio...
Compila tranquillamente.

torn24
30-05-2013, 10:45
All'interno del main , nel ciclo while non incrementi nessuna variabile i++

La chiamata alla funzione ordina() mettila fuori dal while , cosi come la stampa dei dati su file.






#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct corridore{
char nome[200];
char naz [20];
char sqd[20];
int time;
};

void ordina(struct corridore *classifica, int num){
int i, j;
struct corridore temp;
for (i=(num-1); i>=0; i--){
for (j=1; j<=i; j++){
if (classifica [j-1].time > classifica[j].time){
temp=classifica[j-1];
classifica[j-1] = classifica[j];
classifica[j] = temp;
}
}
}

}

int main(int argc, char *argv[]){
FILE *fin, *fout;
char buf [2048];
int num;
int i=0;
int h=0, m=0, s=0;
fin = fopen (argv[1], "r");
fout = fopen (argv[2], "w");

fgets (buf, sizeof(buf), fin); /*Legge la prima riga che indica quanti partecipanti in gara*/
num = atoi(buf);
struct corridore *classifica = malloc(sizeof(struct corridore) *num);
if (classifica == NULL){
printf("Rilevato errore nella classifica\n");
return -1;
}

while (fgets (buf,sizeof(buf), fin) != NULL){
strcpy (classifica[i].nome, strtok(buf, ",:")); /*Mette in nome, l'i*esimo nome da tok*/
strcpy (classifica[i].naz, strtok(NULL, ",:")); /*Mette in naz, l'i*esimo nome da tok*/
strcpy (classifica[i].sqd, strtok(NULL, ",:")); /*Mette in sqd, l'i*esimo nome da tok*/

{h = atoi(strtok(NULL, ":"));
m = atoi(strtok(NULL, ":"));
s = atoi(strtok(NULL, ":"));
classifica[i].time = (h*3600 + m*60 + s); /*Mette in time il tempo calcolato in secondi*/
//CORREZZIONE **********
i++; //INCREMENTO DI I NON ERA PRESENTE

}



}

ordina(classifica, num);//ordina(classifica, num);
//CORREZZIONE ***************
for(i=0;i<num;i++) //FOR PER STAMPARE DOPO ORDINATO
fprintf(fout, "%s %ds\n", classifica[i].nome, classifica[i].time);
fclose(fin);
fclose(fout);
system("pause");
return 0;
}

Shikamaru93
30-05-2013, 16:35
Ahhh lol è vero! Grazie mille!

Loading