PDA

Visualizza la versione completa : [c++] file binary read() write()


lelepro82
27-10-2010, 12:16
Salve a tutti...
Qui sotto ho riportato il codice per inserire in un file binario (.dat) la struttura (persona) ma quando vado ad aprire il file (con un editor di testo ) trovo sequenze disordinate di caratteri.... quello che non riesco a capire è come la funzione write() sistema i dati nel file e come li scrive cioe' in modo leggibile???? confused:


GRAZIE

#include <iostream>
#include <fstream>
using namespace std;
struct persona {
int ID;
char nome [50];
double stipendio;
};
persona dipendente;
int main (){

ofstream fout;
fout.open("anagrafe.dat",ios::app | ios::binary);
if (!fout) {
cout << "\n" << "==> ERRORE APERTURA FILE <==" << "\n\n"<< endl;
}
else {
cout << "matricola delm dipendente (0=fine ) : ";
cin >> dipendente.ID;
while (dipendente.ID != 0) {
cin.ignore(80,'\n');
cout << " cognome nome dipendente ;" ;
cin.getline(dipendente.nome,50);
cout <<" stipendio (euro)";
cin >> dipendente.stipendio;
fout.write((char *) &dipendente, sizeof (dipendente));
cout << "matricola delm dipendente (0=fine ) : ";
cin >> dipendente.ID;
}
fout.close();
}

MItaly
27-10-2010, 12:27
La funzione write usata in quel modo scrive semplicemente la rappresentazione binaria della struttura persona, esattamente come appare in memoria.
Con ogni probabilità (processore x86 a 32 bit) saranno 4 byte per l'ID, 50 byte per il nome, contenenti il testo vero e proprio fino al NUL e poi spazzatura a caso. I double vengono allineati (http://en.wikipedia.org/wiki/Data_structure_alignment) a 4 o 8 byte, a seconda del compilatore e delle opzioni usate con esso, per cui ci dobbiamo aspettare dei byte di padding (dovrebbero essere comunque solo 2, visto che siamo al byte 54, per cui con 2 byte di padding si arriva a 56, multiplo sia di 4 che di 8) che potrebbero contenere qualunque cosa, e infine gli 8 byte del double.
Da un editor di testo "normale" naturalmente non riuscirai a vedere i numeri, poiché non sono formattati, ma viene scritta solo la loro rappresentazione binaria; in generale dovresti riuscire a vedere qualcosa di più con un editor esadecimale.

P.S.: ricordati di inserire il tuo codice tra i tag
..., in modo che mantenga l'indentazione e risulti più leggibile.

#include <iostream>
#include <fstream>
using namespace std;
struct persona {
int ID;
char nome [50];
double stipendio;
};
persona dipendente;
int main (){

ofstream fout;
fout.open("anagrafe.dat",ios::app | ios::binary);
if (!fout) {
cout << "\n" << "==> ERRORE APERTURA FILE <==" << "\n\n"<< endl;
}
else {
cout << "matricola delm dipendente (0=fine ) : ";
cin >> dipendente.ID;
while (dipendente.ID != 0) {
cin.ignore(80,'\n');
cout << " cognome nome dipendente ;" ;
cin.getline(dipendente.nome,50);
cout <<" stipendio (euro)";
cin >> dipendente.stipendio;
fout.write((char *) &dipendente, sizeof (dipendente));
cout << "matricola delm dipendente (0=fine ) : ";
cin >> dipendente.ID;
}
fout.close();
}

Loading