Newsgroup: it.comp.lang.c++
Titolo: Strano ma vero

Ma perchè se scrivo in un file 100 byte e li rileggo il programma mi ritorna
corretti i numeri da 0 a 25.
Dove sbaglio nella lettura o nella scrittura ?
A me sembra tutto corretto, a voi  ?
INIZIO CODICE
#include <stdio.h>
int main(int argc, char* argv[])
{
 FILE *fp;
 char i, n;
 fp=fopen("d:\\cacca","w+");
 if (! fp) return 0;
 i=0;
 while (i<100){
  fwrite(&i,sizeof(char),1,fp);
  i++;
 }
 fseek(fp,0,SEEK_SET);
 i=0;
 while (i<100){
  fread(&n,sizeof(char),1,fp);
        printf("%d  ",n);
  i++;
 }
 getchar();
 return 0;
}
FINE CODICE
ecco l'output :
0  1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17  18  19  20  21
2
  23  24  25  25  25  25  25  25  25  25  25  25  25  25  25  25  25  25  25
2
  25  25  25  25  25  25  25  25  25  25  25  25  25  25  25  25  25  25  25
2
  25  25  25  25  25  25  25  25  25  25  25  25  25  25  25  25  25  25  25
2
  25  25  25  25  25  25  25  25  25  25  25  25  25  25  25  25  25
Booooooooooo :-(
Grazie



 Ma perchč se scrivo in un file 100 byte e li rileggo il programma mi


 Ma perchè se scrivo in un file 100 byte e li rileggo il programma mi


Quando apri il file usa
    fp=fopen("d:\\cacca","wb+")
cioè aggiungendo la 'b' di binary in 'w+' ......
Bye

Ma perchč se scrivo in un file 100 byte e li rileggo il programma mi ritorna


il file alla fine.
con w+ non serve proprio dover chiudere e riaprire in lettura il file!
Luc.

 FINE CODICE
#include <stdio.h>
int main(int argc, char* argv[])
{
 FILE *fp;
 char i, n;
 fp=fopen("e:/pippo","w+"); // Io su D: ho il cd-rom
 if (!fp)
 {
    printf("Impossibile aprire il file.");
    return 0;
 }
 i=0;
 while(i < 100)
 {
    fwrite(&i,sizeof(char),1,fp);
    i++;
 }
 fseek(fp,0,SEEK_SET);
// i=0; questo non serve
// Questo e' il modo corretto per leggere
// tutto un file.
 while (!feof(fp))
 {
    fread(&n,sizeof(char),1,fp);
     printf("%d  ",n);
   //  i++; questo no serve
 }
 getchar();
 return 0;
}
Il tuo programma ha due problemi:
  - pretende di trattare un file come un array;
  - gira sotto dos (o sotto windows).
Quel tipo di ciclo si utilizza per scandire array non file, infatti
il tutto funziona solo perche' la fread() fa avanrare il puntatore
alla prossima posizione all'interno del file.
Sotto Dos vengono distinti i file binari dai file di testo. I due tipi
di file sono assolutamente identici, tanto identici che sotto Unix il
tuo programma avrebbe funzionato senza problemi (sei sfigato ;-)).
Sotto dos alcuni caratteri vengono trattati in maniera particolare es.
i caratteri CRLF vengono traslati in un unico carattere (ma non e' questo
il caso) e il carattere 0x19 (25 in base 10) viene interpretato come "End
of Media": il dos pensa che sia finito il nastro (anche se utilizzi il disco).
Pertanto dopo aver letto questo carattere la fread() non legge piu' niente
e il ciclo continua a stampare l'ultimo carattere letto.
Questo comportamento e' il retaggio di quando la mamorizzazione avveniva su
nastri e il "display" su stampante.
P.S. Se avessi usato il modo corretto di scandire il file te ne saresti accorto
     da solo. Infatti dopo aver letto il carattere 0x19 la funzione feof()
     diventa vera e il ciclo si interrompe. Anche scrivere codice "pulito" serve
     a scoprire gli errori.
Ciao Angelo.

intendevo alla fine del programma .
--
Sergio Bianchi
*******************************************
Luc <TOGL...@nip1.it-TOGLI> wrote in message
up57isc194u9s33vg...@4ax.com...
