C, problema con FREAD

di il
6 risposte

C, problema con FREAD

Ciao a tutti,

ultimamente mi sto studiando le varie funzioni di I/O e ho un problema con la fread.

Dunque, se io mi creo un file, chiamato input e dentro ci scrivo:

8 9 11

54


89


e poi eseguo questa funzione il terminale mi stampa numeri a caso e non quelli contenuti nel file.
#include<stdio.h>
#include<stdlib.h>

int main(){

  FILE *fp; int vet[4], i;

  fp=fopen("input", "r+");

  if(fp==NULL) printf("File non aperto\n");

  if(fread(vet, sizeof(int), 4, fp)!=4) printf("Errore\n");

  else for(i=0; i<4; i++) printf("%d\n", vet[i]);

  return 0;

  

}

qualcuno può darmi una mano??

Grazie a tutti in anticipo!

6 Risposte

  • Re: C, problema con FREAD

    Guarda ,secondo me il primo errore è porre nella condizione if (fread(..) != 4, in quanto fread non restituisce nessun valore!ma immagazzina nel primo argomento che gli dai,uno specificato numero di byte partendo dalla posizione specificata dal puntatore di posizione del file
    infatti io lo uso per gestire file ad accesso casuale, cioè che sono stati strutturati con record di lunghezza fissa....e la fread in particolare legge a partire dal puntatore del file, 4 x sizeof(int) byte
    se vuoi leggere da quel tipo di file, devi usare fscanf
  • Re: C, problema con FREAD

    Ciao, immagino che quel file di testo sia stato scritto manualmente, per cui i numeri 8, 56, ecc.. in realtà non sono numeri, ma sono caratteri ASCII. Di conseguenza il numero 8, che rappresentato come int sarebbe una sequenza di 32 bit (ovvero in esadecimale 0x00000008), è in realtà rappresentato come carattere (cioè 1 solo byte). Andando a vedere nella tabella ASCII si scopre che 8 è rappresentato in esadecimale come 0x38.

    Di conseguenza l'istruzione:
    fread(vet, sizeof(int), 4, fp)
    si va a leggere 4 volte 4 byte dal file (ovvero il primo byte sarà la sequenza 0x38 0x20 0x39 0x20, che rappresentano i caratteri ASCII '8', ' ', '9' e ' ', e così via per gli altri 3 byte) e li piazza nel buffer.
    Quando poi fai la printf dici al compilatore di considerare i vari bit come se rappresentassero un numero intero con segno. Il risultato è che, a seconda dell'endianness del tuo pc, il primo numero che ti verrà stampato sarà uno fra 941635872 (ovvero 0x38203920) e 540614712 (ovvero 0x20392038, cioè i byte sono letti "al contrario"); più probabilmente avrai quest'ultimo risultato, visto che le cpu intel sono little endian.
  • Re: C, problema con FREAD

    @piranha: la fread restituisce il numero di elementi che sono stati letti. Se la fread fosse stata di tipo void avrebbe avuto un errore a compile time!
  • Re: C, problema con FREAD

    Capito tutto, immaginavo fosse un problema del genere infatti!
    Grazie mille della!
  • Re: C, problema con FREAD

    Di niente! Se vuoi leggere correttamente un numero devi interpretarlo come char, altrimenti devi creare il file tramite fwrite (o manualmente tramite un hex editor, ma sarebbe un suicidio )
  • Re: C, problema con FREAD

    Piranha ha scritto:


    ... fread non restituisce nessun valore! ....
    Scusa Piranha ma se fai certe affermazioni sembra che tu non abbia mai visto un libro di C ...

    Se hai dubbi sulle funzioni più comuni, rivedi la documentazione, ad esempio

    http://www.cplusplus.com/reference/cstdio/fread


    Return Value

    The total number of elements successfully read is returned.

    soprattutto perché metti fuori strada chi ha creato il thread ed ha già problemi ...
Devi accedere o registrarti per scrivere nel forum
6 risposte