Printf non stampa i valori

di il
23 risposte

Printf non stampa i valori

Ciao!
Ho scritto questo codice per la lettura di un file da linea di comando.
Non mi da errori, ma non capisco perchè non mi stampa a video il vettore con i dati che ho passato alla printf.

Vi riporto il codice e il file con i dati:

file.txt
13
07 2 BRA 0
08 5 FRA 3
05 2 USA 1
07 2 POR 3
04 2 ITA 0
10 2 BRA 6
03 5 USA 8
08 5 POR 5
10 1 FRA 8

file.c

// PROVA DEI TUFFI

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

#define BUF 500
#define RIGA 50

//definisco la mia struttura dove andrò ad inserire i dati

typedef struct{
	int n_tot_concorrenti;
	int id;
	int n_tuffo;
	char id_giudice;
	int voto;
}dati;


// funzioni lettura file e stampa risultati

FILE *aprifile(char *nome_file, char *modalita);
dati *leggi_file(FILE *fp, int *n_letti);
void stampa_letti(dati *vet, int n);



int main(int argc, char **argv){
	
		if(argc!=2){
			puts("Error input: number file 2 \n");
			exit(-1);
		}
	
	int numero_letti;
		FILE *fp=aprifile(argv[1],"r");
		dati *numero=leggi_file(fp, &numero_letti);
	
	int i;
		for(i=0; i<numero_letti; i++){
		//	if(numero[i].id!=0){
				printf("%d \n",numero[i].voto);	
		//	} 
		}
		
	return 0;
}

FILE *aprifile(char *nome_file, char *modalita){
	FILE * fp=fopen(nome_file,modalita);
    if(fp==NULL){
        fprintf(stderr,"impossibile aprire il file %s in modalita %s",nome_file,modalita);
        exit(-1);
    }
    return fp;		
}
 
dati *leggi_file(FILE *fp,int *n_letti) {
	int buf=BUF;
	int i=0, j=0;
	char riga[RIGA];
	char *tmp;
	*n_letti=0;
	
	dati *vet=(dati*)malloc(buf*sizeof(dati));
	
		tmp=fgets(riga,sizeof(riga),fp);
		while(tmp!=NULL){
			sscanf(riga,"%d %d %c %d ",&vet[j].id,&vet[j].n_tuffo,&vet[j].id_giudice,&vet[j].voto);
			j++;
		}
		
			if(j==buf){
				buf*2;
				if(!(vet=(dati*)realloc(vet,buf*sizeof(dati)))){
					*n_letti=-1;
					return NULL;
				}	
		}
	*n_letti=j;
	vet=(dati*)realloc(vet,j*sizeof(dati));
	return vet;	
}

void stampa_letti(dati *vet, int n){
	int i,j;
		
		for(i=0; i<1; i++){
			printf("%d %d %c %d ",&vet[i].id,&vet[i].n_tuffo,&vet[i].id_giudice,&vet[i].voto);
		}
		
			for(j=0; j<n; j++){
				if(vet[j].id!=0){
				printf("%d %d %c %d",&vet[j].id,&vet[j].n_tuffo,&vet[j].id_giudice,&vet[j].voto);
				}
			}
}		
Grazie!

23 Risposte

  • Re: Printf non stampa i valori

    Al di la delle altre incongruenze, quel 13 nella prima riga del file cosa dovrebbe rappresentare? La quantità delle righe successive coi dati? Perché, se è così, le righe successive sono meno, il che già da solo può creare dei problemi (a meno che si preveda qualche meccanismo di controllo del formato).
  • Re: Printf non stampa i valori

    Il 13 è il numero di partecipanti.

    Mentre le incongruenze quali sarebbero?
  • Re: Printf non stampa i valori

    Dunque dovrebbero esserci 13 righe nel file dei dati? Oppure 9 è giusto? Spieghi meglio il senso dei dati presenti nel file?
  • Re: Printf non stampa i valori

    Il file dei dati è quello che ho messo, i dati sono tutti li.
    Dalla struct dovrebbe essere più o meno chiaro.
    il 13 sono i partecipanti, non indica altro.
    la prima colonna un id che identifica i partecipanti.
    la seconda indica il turno.
    la terza è id del giudice.
    la quarta il punteggio.
    Devo solo leggere il file e salvarli in un vettore.
  • Re: Printf non stampa i valori

    Siamo d'accordo sul senso dei membri della struttura, ma non capisco se il numero in testa al file identifica la quantità dei valori che dovrai immettere nel vettore oppure no (e, se no, non ne capisco il senso nel contesto dell'esercizio). In caso non fosse 13 la quantità dei dati da inserire nel vettore, significa che l'esercizio vuole che si inseriscano nel vettore tanti elementi quante sono le righe del file (esclusa la prima)?

    E' importante, perché avere quel dato (la quantità di elementi del vettore) permetterebbe di evitare la riallocazione, dimensionando il vettore fin da subito con la quantità esatta di elementi necessari.
  • Re: Printf non stampa i valori

    Scusa Lisa ma perché non rispondi sulla faccenda del 13 nella prima riga?

    La linea

    tmp=fgets(riga,sizeof(riga),fp);

    legge la prima riga ovvero

    13\n

    e poi il ciclo while seguente non termina mai (o meglio esce con un overflow di j).

    Rivedi quella parte e fai attenzione alla prima riga del file dei dati.
  • Re: Printf non stampa i valori

    No, il 13 non indica nessuna dimensione. Dato che ogni partecipante può avere più di un turno (quindi più di una riga) non indica il numero di righe da leggere, ma il numero univoco di partecipanti. Quindi immagino non serva per questo esercizio in particolare.

    É esatto quello che dici : "l'esercizio vuole che si inseriscano nel vettore tanti elementi quante sono le righe del file (esclusa la prima)"
  • Re: Printf non stampa i valori

    oregon ha scritto:


    Scusa Lisa ma perché non rispondi sulla faccenda del 13 nella prima riga?

    La linea

    tmp=fgets(riga,sizeof(riga),fp);

    legge la prima riga ovvero

    13\n

    e poi il ciclo while seguente non termina mai (o meglio esce con un overflow di j).

    Rivedi quella parte e fai attenzione alla prima riga del file dei dati.

    XD Il tempo materiale di leggere e scrivere la risposta.
    Come lo scriveresti dunque?
    Perchè cambiando la struct e usando lo stesso codice, riesco a leggere un altro file simile (ha solo più righe e più colonne), e funziona, non capisco perchè qui non stampi nulla.
  • Re: Printf non stampa i valori

    Scusa ... ma ti ho spiegato il perché. Hai letto la mia risposta?

    La prima fgets dovrebbe leggere la prima riga e ignorarla.

    Ma nel ciclo manca la fgets che legge le altre righe.
  • Re: Printf non stampa i valori

    Grazie mille, io l'ho rinominata tmp, pensando che non facesse nulla fuori dal while XD Però adesso mi da un problema con il vettore di char, mi legge solo la prima lettera (giustamente), ho provato a dare la dimensione a id_giudice ma mi stampa caratteri strani. Mh.. ci ragiono su, consigli?
  • Re: Printf non stampa i valori

    Perché il terzo dato d'ogni riga non è un carattere, bensì una stringa di tre caratteri. Dunque non dovresti usare %c, ma %s. Ovviamente anche il campo id_giudice dovrebbe essere cambiato da char a char[4] (4 supponendo che la stringa non contenga mai più di tre caratteri).
  • Re: Printf non stampa i valori

    Prenderei in considerazione la possibilità di conteggiare IN ANTICIPO la quantità delle righe effettivamente presenti nel file e di procedere con l'allocazione DOPO aver ricavato quel dato. In questo modo eviteresti la riallocazione (anche perché così come l'hai implementata non funziona).
  • Re: Printf non stampa i valori

    Intendi questa parte qui? Uso male la funzione realloc?
    while((tmp=fgets(riga,sizeof(riga),fp))!=NULL){
    			sscanf(riga,"%d %d %s %d ",&vet[j].id,&vet[j].n_tuffo,&vet[j].id_giudice,&vet[j].voto);
    			j++;
    		}
    		
    			if(j==buf){
    				buf*2;
    				
    				if(!(vet=(dati*)realloc(vet,buf*sizeof(dati)))){
    					*n_letti=-1;
    					return NULL;
    				}	
    		}
    	*n_letti=j;
    	vet=(dati*)realloc(vet,j*sizeof(dati));
    	return vet;
  • Re: Printf non stampa i valori

    Void* realloc (void* ptr, size_t size);

    Reallocate memory block. Changes the size of the memory block pointed to by ptr.
    The function may move the memory block to a new location (whose address is returned by the function).
    The content of the memory block is preserved up to the lesser of the new and old sizes, even if the block is moved to a new location. If the new size is larger, the value of the newly allocated portion is indeterminate.
    In case that ptr is a null pointer, the function behaves like malloc, assigning a new block of size bytes and returning a pointer to its beginning.

    C90
    Otherwise, if size is zero, the memory previously allocated at ptr is deallocated as if a call to free was made, and a null pointer is returned.

    C99/C11
    If size is zero, the return value depends on the particular library implementation: it may either be a null pointer or some other location that shall not be dereferenced.

    If the function fails to allocate the requested block of memory, a null pointer is returned, and the memory block pointed to by argument ptr is not deallocated (it is still valid, and with its contents unchanged).

    Return Value
    A pointer to the reallocated memory block, which may be either the same as ptr or a new location.
    The type of this pointer is void*, which can be cast to the desired type of data pointer in order to be dereferenceable.

    C90
    A null-pointer indicates either that size was zero (an thus ptr was deallocated), or that the function did not allocate storage (and thus the block pointed by ptr was not modified).

    C99/C11
    A null-pointer indicates that the function failed to allocate storage, and thus the block pointed by ptr was not modified.
Devi accedere o registrarti per scrivere nel forum
23 risposte