Newsgroup: it.comp.lang.c
Titolo: file binari e stringhe

Salve, sto cercando di scrivere un programma che salvi in modalita'
binaria delle stringhe su file e poi le ricarichi in un secondo
momento... il salvataggio non sembra aver problemi, ma ottengo degli
errori durante la fase di caricamento...
programmo sotto dos con il DJGPP:
per aprire il file in scruttura uso il seguente codice;
/* -------------------------------------------  *
 FILE *fd = 0;
 int res = 0;
 int size= 0;
 char *str = "Questa č la mia stringa";
size = strlen( str );
 cout << "size: " << size << endl;
  fd = fopen( "prova.dat", "wb" );
   if ( fd == 0 )
    cerr << "Errore in apertura (1)" << endl;
 res = fwrite(str, size, 1, fd);
  if ( res != 1 )
   cerr << "Errore in scrittura (2)" << endl;
  fclose(fd);
/* -------------------------------------- */
mi chiedo ora come faccio a caricare con la funzione fread (voglio
usare proprio FREAD) quanto ho salvato su file... ho provato + volte
ma ottengo sempre degli errori....
 T__T
ho provato con questa chiamata ma non funziona: ottengo infatti dei
caratteri casuali se STR2 č un buffer di caratteri oppure un NULL se
STR2 č un puntatore ad una stringa... CHAR* STR2;
 res = fread( str2, size, 1, fd);
  if( res != 1 )
   cerr << "Errore in lettura (4)" << endl;
Ringrazio anticipatamente chiunqua sia in grado di darmi una mano :)


Ciao Mauro,
stai usando un mix di c++ e c con quei cout e quei cerr.
Innanzitutto dovresti aprire il file in lettura binaria prima della fread:
 fd = fopen( nfile, "rb" );
seconda cosa , quando alla riga della funzione dove calcoli la size della
stringa da scrivere nel file fai cosi´:
size = strlen( str );
ebbene stai attento perche´ la size ti dice la lunghezza della stringa ma
escludendo il terminatore di stringa 0.
Per cui devi sostituire con:
size = 1+ strlen( str );
Quando invece stai leggendo devi dare una size opportunamente grande che ti
faccia riempire il buffer che hai dichiarato, pur non sapendo quanti bytes
andrai a leggere, al limite ti tronchera´ la stringa se il buffer e´ piu´
piccolo, ma poi per non avere sorprese , quando andrai a stamparla prima
terminala con uno 0;
Es:
#include <stdio.h>
#include <stdlib.h>
#define SIZE 100
void leggi(char *nomefile)
{ 
    FILE *fd = 0;
    int res = 0;
    char str[SIZE];
    fd = fopen( nomefile, "rb" );
 
    res = fread(str, SIZE, 1, fd);
    if( res != 1 )
    {
        printf( "Errore in lettura (4)\n");
        exit(1);
    }
    else
    {
        str[SIZE-1] = 0; /* per sicurezza .... */
        printf("Ecco la stringa letta : [%s]\n", str); 
    }
}
void scrivi(char *nfile)
{
    FILE *fd = 0;
    int res = 0;
    int size= 0;
    char *str = "Questa è la mia stringa";
    size = 1+strlen( str );
    printf( "size: %d\n", size);
    fd = fopen( nfile, "wb" );
    if ( fd == 0 )
    {
        printf("Errore in apertura (1)\n");
        exit(1);
    }
    res = fwrite(str, size, 1, fd);
    if ( res != 1 )
    {
        printf("Errore in scrittura (2)\n");
        exit(1);
    }
    fclose(fd);
}
int main()
{
    scrivi("prova.dat");
    leggi("prova.dat");
    return 0;
}
Provato e funge.
Maurus

Scusami ,
ho dimenticato che devi anche includere
#include <string.h>
per la funzione strlen.
Maurus

Mi cospargo il capo di cenere.... :-(
Per qualche strano motivo mi funzionava sotto un progetto windows in cui
scrivevo su un file la stringa, poi la leggevo ed infine la riscrivevo
uguale su un altro file.
Poi in un altro progetto stavolta solo console, mi faceva errore in lettura
nella fread li´ dove c´e´ il controllo res != 1, perche´ il file da cui
leggo contiene meno caratteri di SIZE che avevo impostato a 100 per
sicurezza.
Per cui la SIZE della define non deve avere un valore superiore al numero di
bytes contenuti nel file.
Maurus

Ciao,
volevo ringraziarti per la tua disponibilita! ^__^
una curiosita': quando scrivo sul file la stringa con la funzione
scrivi(), salvo anche il carattere terminatore '\0' ?
Grazie ancora :)

Mauro Pagano wrote in message ...

Prego,
si´ si scrive anche il terminatore '\0'.
Puoi comunque aprire il file con un editor esadecimale visto che li abbiamo
scritti in binario per controllare.
Ciao
Maurus