Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    Problema con la scrittura su file

    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.

    codice:
    #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.

  2. #2
    Utente di HTML.it L'avatar di torn24
    Registrato dal
    Aug 2008
    Messaggi
    551

    ciao

    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.



    codice:
    #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;
    }
    Tecnologia

  3. #3
    Ahhh lol è vero! Grazie mille!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.