Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 18

Discussione: [C] File Binari

  1. #1

    [C] File Binari

    Ciao a tutti. Ho un problema con i file binari e con l'feof (praticamente non si ferma alla fine del file).

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define dmaxS 100
    #define dmax 3
    
    typedef struct record{
    	char cognome[dmaxS];
    	char nome[dmaxS];
    	char sesso;
    	int anno;
    }record;
    
    int main(){
    	record elenco[dmax];
    	record elenco2[dmax];
    	int dim;
    	FILE *fp;
    	int i;
    	for(i=0;i<dmax;i++){
    		printf("%d)\n",i);
    		printf("Cognome: ");
    		gets(elenco[i].cognome);
    		printf("Nome: ");
    		gets(elenco[i].nome);
    		printf("Sesso: ");
    		scanf("%c",&(elenco[i].sesso));
    		fflush(stdin);
    		printf("Anno di nascita: ");
    		scanf("%d",&(elenco[i].anno));
    		fflush(stdin);
    		printf("\n");
    	}
    	fp = fopen("prova.bin","wb");
    	if(fp != NULL){
    		for(i=0;i<dmax;i++){
    		   fwrite(elenco[i].cognome,sizeof(char),dmaxS,fp);
    		   fwrite(elenco[i].nome,sizeof(char),dmaxS,fp);
    		   fwrite(&(elenco[i].sesso),sizeof(char),1,fp);
    		   fwrite(&(elenco[i].anno),sizeof(int),1,fp);
    		}
    		fclose(fp);
    		fp = fopen("prova.bin","rb");
    		if(fp != NULL){
    			i=0;
    			while(!feof(fp)){ // non si ferma al terzo ciclo
    				fread(elenco2[i].cognome,sizeof(char),dmaxS,fp);
    				fread(elenco2[i].nome,sizeof(char),dmaxS,fp);
    				fread(&(elenco2[i].sesso),sizeof(char),1,fp);
    				fread(&(elenco2[i].anno),sizeof(int),1,fp);
    				i++;
    			}
    			dim = i;
    			fclose(fp);
    			for(i=0;i<dim;i++){
    				printf("\n");
    				puts(elenco2[i].cognome);
    				puts(elenco2[i].nome);
    				printf("%c\n",elenco2[i].sesso);
    				printf("%d\n",elenco2[i].anno);
    			}
    		}
    	}
    	system("pause>nul");
    	return 0;
    }

  2. #2
    Utente bannato
    Registrato dal
    Feb 2004
    Messaggi
    2,817
    non è lì il problema, è che nel while alla riga 47 incrementi i una volta in più: i alla fine vale 4, quindi nel for stampi caratteri casuali alla fine.
    in effetti non ho capito il perché dell'istruzion alla riga 54 dim=i, quando le strutture sono allocate staticamente con dmax = 3.

    quindi correggi la riga 56: for(i=0;i<dmax;i++)

  3. #3
    Scusa, ma se ho tre elementi con i che parte da 0:
    leggo il primo, i=1
    leggo il secondo, i=2
    leggo il terzo, i=3
    dim = 3. Dove sarebbe l'errore?
    ho messo apposta il while per verificare che ne leggesse solo 3

  4. #4
    Utente bannato
    Registrato dal
    Feb 2004
    Messaggi
    2,817
    Originariamente inviato da darth fener
    Scusa, ma se ho tre elementi con i che parte da 0:
    leggo il primo, i=1
    leggo il secondo, i=2
    leggo il terzo, i=3
    dim = 3. Dove sarebbe l'errore?
    ho messo apposta il while per verificare che ne leggesse solo 3
    che bello essere contestati
    scusami ma prima di postare hai provato a stampare la variabile i dopo il while?

    il while è questo
    leggo il primo, i=1
    leggo il secondo, i=2
    leggo il terzo, i=3
    leggo ancora: le 4 fread leggono eof, i=4
    la condizione del while solo ora non è soddisfatta e quindi esco

  5. #5
    Si, è 4 perchè non si ferma quando si dovrebbe fermare con l'feof(),(praticamente l'errore che ho indicato fra i commenti). I cicli come puoi vedere non dipendono dalla i, ma dallo stato del file (se sono alla fine o no). Se prima ho messo 3 strutture, perchè dopo aver letto 3 strutture mi dice che il file non è ancora finito? Secondo me, una volta letto il terzo si dovrebbe fermare perchè il file è finito, invece va avanti portando l'indice a 4...

  6. #6
    Utente bannato
    Registrato dal
    Feb 2004
    Messaggi
    2,817
    ti ho spiegato nel post sopra come gira il while, non c'è nessun errore. devi solo modificare la condizione del for che stampa

  7. #7
    Ho trovato l'errore, era nel while, proprio l'feof(), comunque adesso ho risolto

  8. #8
    Utente bannato
    Registrato dal
    Feb 2004
    Messaggi
    2,817
    bah

  9. #9
    Originariamente inviato da ant_alt
    bah


    feof() ti dice se è stata raggiunta la fine del fine(va a guardare se hai raggiunto il carattere EOF), nei file binari EOF non c'è e quindi andava avanti.
    Per sapere quando ho raggiunto la fine del file, devo controllare il numero di elementi letti dalla fread()...

  10. #10
    Originariamente inviato da darth fener


    feof() ti dice se è stata raggiunta la fine del fine(va a guardare se hai raggiunto il carattere EOF), nei file binari EOF non c'è e quindi andava avanti.
    Non è vero, feof verifica se il bit di EOF associato allo stream è settato, e il bit in questione viene impostato quando una lettura dal file non è andata a buon fine perché non ci sono più dati da leggere.
    Amaro C++, il gusto pieno dell'undefined behavior.

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 © 2019 vBulletin Solutions, Inc. All rights reserved.