Problema scrittura e lettura su file

di Anonimizzato14574 il
8 risposte
Stavo facendo qualche prova usando fwrite e fread, il compilatore non da errori e il programma sembra funzionare correttamente ma quando vado ad aprire il file modificato dal programma mi dice che ci sono caratteri non validi (io ho inserito solo numeri). Qualcuno saprebbe spiegarmi il motivo?

(usando fscanf e fprintf nessuno problema, il contenuto del file è corretto)

posto il codice:

// operazioni base su file fwrite e fread
#include <stdio.h>
#include <stdlib.h>
int main(){
	FILE *pf;
	int i,num;
	pf =fopen("dati.txt","w");
	if (pf){
		for (i=0;i<4;i++){
			printf("inserisci numero: ");
			scanf("%d\n",&num);
			fwrite(&num,sizeof(int),1,pf);
		}
		fclose(pf);
	}else{
		exit(EXIT_FAILURE);
	}
	pf=fopen("dati.txt","r");
	if (pf){
		for (i=0; i<4;i++){
			fread(&num,sizeof(int),1,pf);
			printf("%d\n",num);
		}
		fclose(pf);
	}
	return 0;
}

8 Risposte

  • Per usare la fread e la fwrite i file devono essere aperti in binario con

    "wb"

    "rb"
  • Anche modificando "w" con "wb" e "r" con "rb" da lo stesso problema .-.

    ... mi sta venendo un dubbio: potrebbe essere che il file in binario è scritto correttamente ma non posso visualizzare il contenuto con un editor di testo qualunque perchè scritto in binario?
  • Wb e rb sono necessari

    Ovviamente non potrai visualizzare i dati con un editor di testo. Dovrai usare un editor binario o il debug da console.
  • Il file che scrivi E' in binario, basta che noti come hai scritto la fwrite (e la fread). Quindi il tuo file, contenendo caratteri con codice ascii < 32, manda in errore l'editor di testo che si aspetta solo caratteri coerenti con un file di testo.
  • Ciao,
    tu leggi alcuni numeri ma vuoi ovviamente stampare i caratteri corrispondenti. Nel senso che se leggi 1 allora vuoi stampare '1', e non il carattere corrispondente al codice ASCII 1 (che è un carattere speciale).
    Per far questo puoi modificare il ciclo di scrittura in questo modo:
    
            for (i=0; i<4; i++)
            {
                printf("inserisci numero: ");
                scanf("%d",&num);
                char c = num+'0';
                fwrite(&c,sizeof(char),1,pf);
            }
            fclose(pf);
    
    In particolare rifletti su cosa fa la riga
    char c = num+'0';
  • Grazie a tutti per le risposte, sono state tutte utili! Molto carina l'idea di minomic grazie!
  • aguero93 ha scritto:


    Molto carina l'idea di minomic grazie!
    Prego, però il merito di questa idea non è mia. Io l'ho già vista (e utilizzata) più volte e credo sia uno di quei procedimenti standard per queste cose.

  • Convertire un valore binario in ASCII aggiungendo 48 (0x32 ovvero '0') è normalissimo.

    Ma non lo userei se stessi usando un file binario proprio perché se lo faccio voglio memorizzare i dati in binario (con fwrite/fread). Altrimenti uso la modalità testo e le più comode funzioni per la scrittura/lettura di testo.
Devi accedere o registrarti per scrivere nel forum
8 risposte