Visualizzazione dei risultati da 1 a 2 su 2
  1. #1

    [c++] file binary read() write()

    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();
    }

  2. #2
    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 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 [code]...[/code], in modo che mantenga l'indentazione e risulti più leggibile.
    codice:
    #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();
    }
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.