Lettura stringa con fread dopo malloc

di il
25 risposte

Lettura stringa con fread dopo malloc

Buongiorno,
In un programma io creo un file binario che contiene in prima posizione la lunghezza della stringa, e successivamente la stringa stessa. Dopo il programma deve leggere il file binario e stampare la stessa stringa. Apro allora un nuovo file in modalità "wb", dichiaro char *buf ed eseguo i seguenti comandi:

fread(&lun,sizeof(lun),1,out); //dovrebbe leggere lun (numero caratteri stringa)

buf = malloc(lun*sizeof(char)); //allocare la stringa per [lun * sizeof(char)]

fread(buf,sizeof(buf),1,out); //leggere la stringa da file

printf("%s",buf); //stamparla

Il problema è che se su file scrivo UnoDueTre, effettivamente lun vale 10 provando a stamparne il valore, ma il risultato dell'ultimo printf di buf è solamente "UnoD" oppure vengono aggiunti dopo caratteri casuali.
So che fread si ferma a /0 e non a /n ma non saprei neanche dire se il problema è quello, e nel caso a risolverlo.

Ringrazio infinitamente chiunque proverà a darmi una mano, sono alle primissime armi con le allocazioni dinamiche!!

25 Risposte

  • Re: Lettura stringa con fread dopo malloc

    Devi allocare anche un carattere in più per il terminatore \0 della stringa e impostarlo nel codice dopo la lettura

    P.S. Apri in wb per leggere?
  • Re: Lettura stringa con fread dopo malloc

    oregon ha scritto:


    Devi allocare anche un carattere in più per il terminatore \0 della stringa e impostarlo nel codice dopo la lettura

    P.S. Apri in wb per leggere?
    Ah no scusa, errore di battitura. Apro ovviamente in rb.
    Il "+1" dove dovrei inserirlo? A logica mi verrebbe da pensare di scrivere malloc((lun+1)*sizeof(char)) ma il risultato ora è:
    UnoD©lAUSE invece che UnoDueTre
  • Re: Lettura stringa con fread dopo malloc

    Devi anche memorizzare il \0 nell'ultimo carattere della stringa allocata.

    Un attimo ... ma perché sizeof lun ????

    Se la lunghezza della stringa è lun devi solamente usare

    (lun+1)

    la sizeof solo in sizeof(char)
  • Re: Lettura stringa con fread dopo malloc

    Ovvero

    buf = malloc((lun+1)*sizeof(char));
    fread(buf,lun*sizeof(char),1,out);
    buf[(lun+1)*sizeof(char)) = '\0';

    Se hai ancora dubbi o malfunzionamenti, posta tutto il codice compreso quello che usi per scrivere
  • Re: Lettura stringa con fread dopo malloc

    oregon ha scritto:


    Ovvero

    buf = malloc((lun+1)*sizeof(char));
    fread(buf,lun*sizeof(char),1,out);
    buf[(lun+1)*sizeof(char)) = '\0';

    Se hai ancora dubbi o malfunzionamenti, posta tutto il codice compreso quello che usi per scrivere
    Parte scrittura:
    str = malloc(n*sizeof(char));

    printf("\nInserisci la frase [max caratteri: 807]");
    scanf("%s",str);

    fwrite(&n,sizeof(n),1,in);
    fwrite(str,sizeof(str),1,in);

    Parte lettura:

    fread(&lun,sizeof(lun),1,out);

    buf = malloc((lun+1)*sizeof(char));

    fread(buf,lun*sizeof(char),1,out);

    buf[(lun+1)*sizeof(char)] = '\0';

    printf("\n%s",buf);
  • Re: Lettura stringa con fread dopo malloc

    Fai confusione tra sizeof e strlen

    Che vuoi fare esattamente con le due fwrite e le due fread?
    Quanto vale n?
  • Re: Lettura stringa con fread dopo malloc

    oregon ha scritto:


    Fai confusione tra sizeof e strlen

    Che vuoi fare esattamente con le due fwrite e le due fread?
    Quanto vale n?
    Allora, n è semplicemente un "massimo" dato da un altra parte dell'algoritmo. Quello non fa parte di questa porzione.
    Io vorrei che nella prima parte del file binario ci sia la lunghezza che bisogna allocare nella lettura, e nella seconda venga stampata.

    -Utente inserisce stringa
    -Viene creato file binario con: LUNGHEZZA STRINGA - STRINGA
    -Viene letto il file binario: prima la lunghezza --> viene allocata la stringa con quella lunghezza --> viene letta e poi stampata la stringa.

    Faccio questo perchè poi vorrei cryptare la scrittura e decryptare la lettura con la stessa chiave.
  • Re: Lettura stringa con fread dopo malloc

    Quindi
    
    	const int n = 100;
    	FILE *fr, *fw;
    	char *str, *buf;
    	int lw, lr;
    
    	// scrive
    	fw = fopen("file.txt", "wb");
    	if (!fw) {
    		cout << "errore";
    		return 1;
    	}
    	str = (char *)malloc(n * sizeof(char));
    	scanf("%s", str);
    
    	lw = strlen(str);
    	fwrite(&lw, sizeof(lw), 1, fw);
    	fwrite(str, strlen(str), 1, fw);
    	fclose(fw);
    	free(str);
    
    	// legge
    	fr = fopen("file.txt", "rb");
    	if (!fr) {
    		cout << "errore";
    		return 1;
    	}
    	fread(&lr, sizeof(lr), 1, fr);
    	buf = (char *)malloc((lr + 1) * sizeof(char));
    	fread(buf, lr * sizeof(char), 1, fr);
    	buf[lr * sizeof(char)] = '\0';
    	printf("\n%s", buf);
    	free(buf);
    
  • Re: Lettura stringa con fread dopo malloc

    oregon ha scritto:


    Quindi
    
    	const int n = 100;
    	FILE *fr, *fw;
    	char *str, *buf;
    	int lw, lr;
    
    	// scrive
    	fw = fopen("file.txt", "wb");
    	if (!fw) {
    		cout << "errore";
    		return 1;
    	}
    	str = (char *)malloc(n * sizeof(char));
    	scanf("%s", str);
    
    	lw = strlen(str);
    	fwrite(&lw, sizeof(lw), 1, fw);
    	fwrite(str, strlen(str), 1, fw);
    	fclose(fw);
    	free(str);
    
    	// legge
    	fr = fopen("file.txt", "rb");
    	if (!fr) {
    		cout << "errore";
    		return 1;
    	}
    	fread(&lr, sizeof(lr), 1, fr);
    	buf = (char *)malloc((lr + 1) * sizeof(char));
    	fread(buf, lr * sizeof(char), 1, fr);
    	buf[lr * sizeof(char)] = '\0';
    	printf("\n%s", buf);
    	free(buf);
    
    Ti ringrazio davvero per il tuo tempo! Il programma ora funziona ed analizzando per bene il codice ho capito dove sbagliavo (non effettuavo uno strlen della stringa alla scrittura, quindi allocavo lo spazio massimo e non quello effettivo. Inoltre confondevo appunto nel primo fread sizeof con strlen, che era la scelta ovviamente corretta).
    Ho un altra domanda veloce, ho sostituito lo fscanf con un fgets(str,strlen(str),stdin) per poter inserire anche gli spazi. La stringa viene effettivamente presa anche con essi, ma al momento della lettura viene troncata al primo spazio incontrato... come potrei risolvere?
    Grazie mille!!
  • Re: Lettura stringa con fread dopo malloc

    Fscanf fgets ?

    Ma non parlavamo di fread ?
  • Re: Lettura stringa con fread dopo malloc

    oregon ha scritto:


    Fscanf fgets ?

    Ma non parlavamo di fread ?
    Parlo della primissima lettura della frase da parte dello scanf("%s",str);
    Mi sono spiegato male effettivamente
  • Re: Lettura stringa con fread dopo malloc

    Cosa hai scritto esattamente? Mostra il nuovo codice dall'inizio non solo qualche riga
  • Re: Lettura stringa con fread dopo malloc

    oregon ha scritto:


    Cosa hai scritto esattamente? Mostra il nuovo codice dall'inizio non solo qualche riga
    Ho semplicemente cambiato il primo scanf con un fgets, ma non basta ancora. Al momento della lettura tronca al primo spazio.

    str = (char *) malloc (n*sizeof(char));
    scanf("%s", str); --> fgets(str,strlen(str),stdin);
  • Re: Lettura stringa con fread dopo malloc

    A me non succede. Elimina il file dei dati e riprova.

    Se hai altri problemi allora hai cambiato qualche altra parte del programma. Quindi mostralo nuovamente tutto. Mi raccomando, mostralo tutto anche se credi che sia uguale altrimenti perdiamo solo tempo.
Devi accedere o registrarti per scrivere nel forum
25 risposte