2011-06-13 16 views
7

Ho bisogno di leggere e scrivere dati binari in C++. Uso dalle classi ofstream e ifstream ma non posso leggere alcuni caratteri come 9,13,32. Se esiste un altro modo di leggere e scrivere il tema.come posso leggere i dati binari in C++?

+2

Si prega di mostrare il proprio codice. Hai impostato 'std :: ifstream :: binary' nel campo della modalità aperta? –

+0

Mostra un frammento di codice, l'output che ti aspetti e l'output che hai ottenuto. –

+0

si prega di consultare http://stackoverflow.com/questions/5355163/writing-binary-data-stdstring-to-an-stdofstream – davka

risposta

2

Ecco un programma che fa questo:

#include <iostream> 
#include <fstream> 

int main(int argc, const char *argv[]) 
{ 
    if (argc < 2) { 
     ::std::cerr << "Usage: " << argv[0] << "<filename>\n"; 
     return 1; 
    } 
    ::std::ifstream in(argv[1], ::std::ios::binary); 
    while (in) { 
     char c; 
     in.get(c); 
     if (in) { 
     ::std::cout << "Read a " << int(c) << "\n"; 
     } 
    } 
    return 0; 
} 

Ecco un esempio che venga eseguito in Linux:

$ echo -ne '\x9\xd\x20\x9\xd\x20\n' >binfile 
$ ./readbin binfile 
Read a 9 
Read a 13 
Read a 32 
Read a 9 
Read a 13 
Read a 32 
Read a 10 
+8

Risoluzione dello spazio dei nomi paranoico! :-) –

+0

@Kerrek SB: Perché, sì, vedere http://stackoverflow.com/questions/1661912/why-does-everybody-use-unanchored-namespace-declarations-ie-std-not-std * grande sorriso * – Omnifarious

+0

Funziona, ma è molto inefficiente se il file è grande. Per prestazioni migliori, utilizzare il metodo Stuard Golodetz. Per prestazioni ancora migliori, usa std :: streambuf. – user763305

6

Aprire il file utilizzando il flag std::ios::binary e quindi utilizzare read e write anziché gli operatori di streaming.

Ci sono alcuni esempi qui:

http://www.cplusplus.com/reference/iostream/istream/read/

http://www.cplusplus.com/reference/iostream/ostream/write/

+1

per favore spiegane altro. –

+2

@mehdi, ti ha dato documentazione ed esempi. Che cosa vuoi di più? – Beta

+0

Guarda l'esempio nel primo link. Aprirà un file, leggerà il contenuto e inserirà il contenuto in un buffer di caratteri. Il buffer verrà trattato come una matrice di byte essenzialmente. Esattamente di cosa hai bisogno di più spiegazioni? Come gestire il buffer e prendere valori da esso? – rzetterberg

1

Questo è un esempio di base (senza alcun controllo degli errori!):

// Required STL 
#include <fstream> 
using namespace std; 

// Just a class example 
class Data 
{ 
    int a; 
    double b; 
}; 

// Create some variables as examples 
Data x; 
Data *y = new Data[10]; 

// Open the file in input/output 
fstream myFile("data.bin", ios::in | ios::out | ios::binary); 

// Write at the beginning of the binary file 
myFile.seekp(0); 
myFile.write((char*)&x, sizeof (Data)); 

... 

// Assume that we want read 10 Data since the beginning 
// of the binary file: 
myFile.seekg(0); 
myFile.read((char*)y, sizeof (Data) * 10); 

// Remember to close the file 
myFile.close(); 
+0

Nessun compilatore conforme agli standard costruirà questo file. ** 'std ::' ** 'fstream' è in' '(no' .h'). – Johnsyweb

+0

Suggerimenti applicati .. scusa per il ritardo! Perché @johnsyweb non ha modificato il mio codice? – gmas80