9
votes

Comment puis-je lire des données binaires en C ++?

J'ai besoin de lire et d'écrire des données binaires en C ++. J'utilise à partir de ofstream et ifstream classes, mais il ne peut pas lire des caractères de 9,13,32. Si existe-t-il une autre façon de lire et d'écrire un thème.


4 commentaires

S'il vous plaît montrer votre code. Avez-vous défini std :: ifstream :: binaire dans le champ en mode ouvert?


Veuillez afficher un extrait de code, la sortie que vous attendez et la sortie que vous avez reçue.


Veuillez vous reporter à Stackoverflow.com/cetions / 5355163 / ...


La méthode que je donne dans mes travaux de réponse, mais elle effectue relativement peu. Je suggérerais de lire les références L'autre réponse donnait parce que les fonctions mentionnées ont effectivement performer beaucoup plus rapidement, bien qu'ils soient un peu plus complexes de manière conceptuelle.


3 Réponses :


6
votes

Ouvrez le fichier à l'aide du drapeau STD :: iOS :: binaire Binary lisez et écrire plutôt que les opérateurs de streaming. < / p>

Il y a quelques exemples ici:

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

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


2 commentaires

@mehdi, il vous a donné une documentation et des exemples. Que veux-tu de plus?


Regardez l'exemple dans le premier lien. Il ouvrira un fichier, lisez le contenu et mettra le contenu dans un tampon de charme. Le tampon sera traité comme une gamme d'octets essentiellement. Exactement, qu'est-ce que vous avez besoin de plus d'explication de? Comment gérer le tampon et prendre des valeurs de celui-ci?



4
votes

Voici un programme qui fait:

$ 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


4 commentaires

Résolution de l'espace de noms paranoïaque! :-)


@Kerrek SB: Pourquoi, oui, voir Stackoverflow.com/Questtions/1661912/... Grand Grin


Cela fonctionne, mais est très inefficace si le fichier est grand. Pour une meilleure performance, utilisez la méthode Stuard Golodetz. Pour une meilleure performance, utilisez STD :: Streambuf.


@ user763305: Eh bien, oui, ça n'effectue pas tout ça. Mais l'OP ne semblait pas avoir envie de nuances. Et l'autre réponse a simplement des liens vers la documentation. Il n'y a donc pas de méthode, juste une indication sur la manière dont vous pourriez le faire. :-)



1
votes

Ceci est un exemple de base (sans vérification d'erreur!):

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


2 commentaires

Aucun compilateur compatible des normes ne construira ce fichier. std :: FRStream est dans (non .h ).


Suggestions appliquées. Désolé pour le retard! Pourquoi @johnsyweb n'a-t-il pas modifié mon code?