2012-08-01 1 views
1

J'ai un pointeur de type uint8_t * type ptr, pointant vers 32 octets de données binaires. Je voudrais imprimer le contenu vers lequel mon pointeur pointe vers un fichier en C++. Je vais avec le mode binaire-à-direécriture d'un type uint8_t dans un fichier C++

ofstream fp; 
fp.open("somefile.bin",ios::out | ios :: binary); 
//fp.write(here is the problem) 
fp.write((char*)ptr,sizeof(ptr)); 

Est-il possible que je peux le faire pour que j'imprimer le contenu que PTR pointe parce que la façon dont je vient de montrer, je reçois 8 octets de données dans le fichier alors qu'il pointe vers 32 octets de données.

+0

Que pensez-vous est le problème avec 'fp.write ((char *) ptr, 32) "? – jahhaj

Répondre

7

Vous obtenez 8 octets parce que le pointeur sur votre ordinateur est 64 bits. Par conséquent, sizeof(ptr) renvoie 8 - vous obtenez la taille du pointeur, pas la taille du tableau. Vous devez être de passage de la taille des données à écrire à côté du pointeur, par exemple, comme ceci:

uint8_t data[32]; 
// fill in the data... 
write_to_file(data, sizeof(data)); 

void write_to_file(uint8_t *ptr, size_t len) { 
    ofstream fp; 
    fp.open("somefile.bin",ios::out | ios :: binary); 
    fp.write((char*)ptr, len); 
} 
+0

beaucoup de réponses, jusqu'à présent c'est la seule correcte. – Chad

+0

De plus, lorsqu'il s'agit de données binaires, streambuf/filebuf est plus pratique que ostream/ofstream orienté formatage. – DanielKO

0
double pi = 3.1415926535; // IEEE 8 bytes 
uint8_t bytes[8] = { 0 }; 
double* dp = (double*)(&bytes[0]); //force dp to point to bytes 
*dp = pi; // copies pi into bytes 
file.write((char*)dp,sizeof(bytes));