Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Aug 2007
    Messaggi
    57

    [C++] Problema con lettura di file binari

    Salve, ho bisogno di scrivere un file binario che contenga degli oggetti di una classe Coordinate i cui attributi sono x1, x2, y1, y2 int e filename string.
    Per la scrittura si utilzzano questi comandi:
    codice:
    ofstream of;
    of.open("./coordinates.bin", ios::out | ios::binary);
    ifstream reader;
    reader.open("./coordinates.bin", ios::in | ios::binary);
    for (int j = 0; j < (int) coordinates->size(); j++) {
       of.write((char*) (*coordinates)[j], sizeof(Coordinate));
    }
    of.close();
    Dove coordinates è un Vector<Coordinate*>*.
    Per la lettura invece agiamo in questo modo:
    codice:
    vector<Coordinate*> V;
    Coordinate* ptr;
    reader.seekg(0,ios::end);
    int size=reader.tellg();
    reader.seekg(0,ios::beg);
    int iteration=size/sizeof(Coordinate);
    int reminder=size%sizeof(Coordinate);
    while(iteration>0){
        reader.read((char*)ptr,sizeof(Coordinate));
        V.push_back(ptr);
        iteration--;
    }
    if(reminder>0){
        reader.read((char*)ptr,reminder);
        V.push_back(ptr);
    }
    reader.close();
    cout<<((V[0])).getX1()<<endl;
    cout<<((V[0])).getFilename()<<endl;
    }
    Il problema è che non leggo in realtà nulla.
    Chi può aiutarmi nella lettura?
    Grazie a tutti.

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Spero che quel filename di cui parli sia un char[QUALCOSA] e non una std::string, altrimenti tutto il tuo ragionamento è fallato in partenza.
    Comunque per leggere tutto il file è sufficiente:

    codice:
    vector<Coordinate*> V;
    Coordinate* ptr = new Coordinate;
    while(reader){
        reader.read((char*)ptr,sizeof(Coordinate));
        V.push_back(ptr);
    }
    reader.close();
    cout<<((V[0])).getX1()<<endl;
    cout<<((V[0])).getFilename()<<endl;
    }
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  3. #3
    Utente di HTML.it
    Registrato dal
    Aug 2007
    Messaggi
    57
    Filename è un char*.

  4. #4
    Utente di HTML.it
    Registrato dal
    Aug 2007
    Messaggi
    57
    Ho seguito i vostri consigli e ora funziona. Il problema è che nel file binario salva sempre l'ultimo elemento di coordinates, e non mi riesca capire come mai. Idee?

  5. #5
    Utente di HTML.it
    Registrato dal
    Aug 2007
    Messaggi
    57
    Risolto, si può chiudere, grazie a tutti. Il codice corretto è:
    codice:
    	ofstream of;
    	of.open("./coordinates.dat", ios::out | ios::binary);
    	ifstream reader;
    	reader.open("./coordinates.dat", ios::in | ios::binary);
    	for (int j = 0; j < (int) coordinates->size(); j++) {
    		of.write((char*) (*coordinates)[j], sizeof(Coordinate));
    	}
    	of.close();
    	vector<Coordinate*> V;
    	while (reader) {
    		Coordinate* ptr=new Coordinate();
    		reader.read((char*) ptr, sizeof(Coordinate));
    		V.push_back(ptr);
    	}
    	reader.close();
    	cout<<V.size()<<"\t"<<coordinates->size()<<endl;
    	for ( int i = 0; i < (int) V.size(); i++ )
    	{
    		cout<<(*(V[i])).getX1()<<"\t";
    		cout<<(*(V[i])).getX2()<<"\t";
    		cout<<(*(V[i])).getY1()<<"\t";
    		cout<<(*(V[i])).getY2()<<"\t";
    		cout<<(*(V[i])).getImageId()<<"\t";
    		cout<<(*(V[i])).getFilename()<<endl;
    	}

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.