2017-04-23 1 views
0

Dans le livre que je suis en train de lire, il a commencé à parler des binaires et de la manière dont nous pouvons générer un fichier binaire de la même façon que nous pouvons exporter vers un fichier texte. J'ai donc commencé à lire plus et je voulais essayer; cependant, j'ai rencontré ce qui me semble être un problème simple, mais que je ne comprends pas correctement compte tenu de mon manque de compréhension en ce qui concerne les fichiers binaires. Donc, disons que j'ai créé une structure et une fonction. Comme le suivant.Problème de sortie dans un fichier binaire en C++

struct celebrities 
{ 
    char name[15]; 
    char lastName[15]; 
}; 
void BinaryCreation(celebrities); 
int main() 
{ 
    celebrities actors = { "Denzel", "Washington" }; 

    BinaryCreation(actors); 

    system("pause"); 

} 

Maintenant, je vais créer un fichier binaire:

void BinaryCreation(celebrities actors) 
{ 

     fstream file; 
     file.open("binaryfile.txt", ios::binary | ios::out); 

Maintenant, dans le livre, il dit que je devrais écrire quelque chose comme ce qui suit pour le sortir en binaire:

file.write(address, size) 

C'est là que ça devient confus de voir comment, si j'ai une structure, comment je fais ça? J'ai essayé ce qui suit:

file.write(&actors.name, sizeof(actors.name)); 
file.write(&name, sizeof(name)); 

Vous avez également essayé de réinterpréter la distribution. J'ai aussi fait ce qui suit

file.write(actors.name, sizeof(actors.name)); 

qui a travaillé dans le sens d'aucune erreur, mais il serait sortie de fichier sous forme de texte (ASCII).

Je suis sûr que c'est très simple, et je néglige quelque chose, mais pour l'instant je ne peux pas comprendre.

+1

La modification du type de sortie en binaire ne change pas votre texte en un autre par magie. C'est toujours du texte, et sera toujours écrit comme les mêmes valeurs. La différence est que la sortie binaire peut contenir des caractères qui ne sont pas du texte (comme NULL, ou 0x01 ou 0x02). –

+0

@KenWhite Je vois, c'est ce qui m'a ébranlé, je m'attendais à un tas de symboles, et à la place j'ai eu le même texte. Merci pour la contribution. – ReMaKe

Répondre

1

La bonne façon d'écrire le contenu de la mémoire brutes de l'objet serait:

file.write(reinterpret_cast<char *>(&actors), sizeof(actors)); 

mais il serait sortie de fichier sous forme de texte (ASCII).

Eh bien, votre structure contient uniquement du texte, le texte est ce que vous verrez lorsque vous l'ouvrirez.

Aussi je devine que vous n'avez pas ouvert le fichier dans un éditeur hexadécimal. Si vous le faisiez, vous verriez que chaque champ occupe 15 octets, que le texte contenu dans chaque tableau de caractères occupe moins d'espace. Les octets de remplissage supplémentaires entre les champs peuvent ne pas être représentés comme des caractères imprimables dans le programme que vous utilisiez pour afficher le contenu du fichier.

Par exemple, étant donné ce programme:

#include <iostream> 

struct celebrities 
{ 
    char name[15]; 
    char lastName[15]; 
}; 

int main() { 
    celebrities actors = { "Denzel", "Washington" }; 

    std::cout.write(reinterpret_cast<char *>(&actors), sizeof(actors)); 

    return 0; 
} 

et cette tuyauterie Compiler la sortie du programme xxd donne les éléments suivants:

0000000: 4465 6e7a 656c 0000 0000 0000 0000 0057 Denzel.........W 
0000010: 6173 6869 6e67 746f 6e00 0000 0000  ashington..... 

Chaque champ occupe exactement 15 octets. L'espace inutilisé après la terminaison de chaîne nulle est un caractère nul supplémentaire (octet 0). Si vous avez précédemment stocké une chaîne plus longue dans l'un des champs de l'objet, vous pouvez en voir des restes dans le fichier de sortie.

Si nous #include <cstring> et ajoutez cette ligne directement au-dessus de l'appel à std::cout.write() dans le programme ci-dessus:

std::strcpy(actors.lastName, "Whitaker"); 

L'exécution du programme produit maintenant ce contenu:

0000000: 4465 6e7a 656c 0000 0000 0000 0000 0057 Denzel.........W 
0000010: 6869 7461 6b65 7200 6e00 0000 0000  hitaker.n..... 

Notez le n seul, à gauche plus de la fin de la valeur précédente, "Washington".

+0

Ouais ce deuxième code a fonctionné. J'ai toujours pensé que binaire était pratiquement des symboles et des nombres, essentiellement la façon dont votre sortie est sorti. Je vais télécharger un éditeur hexadécimal pour le vérifier. – ReMaKe

+0

@ReMaKe Techniquement, les fichiers binaires (tous les fichiers, en fait) n'ont aucune signification inhérente; il doit y avoir une interprétation de leur contenu pour qu'ils soient utiles. Les données stockées en mémoire sous forme d'ASCII sont écrites en ASCII (sauf si elles sont codées en premier). Ce que vous obtenez dans votre fichier de sortie est ce qui est stocké dans chaque tableau - qui est ASCII. Donc le fichier ressemble à du texte parce que, bon ... c'est ce qui est stocké dedans! Notez que "ma sortie" est la sortie du programme * acheminée via un outil hexadécimal * qui affiche le code hexadécimal pour chaque octet. – cdhowie

+0

Je vois. Je suis sûr que le livre l'expliquera dans les pages suivantes, chapitres, mais y at-il une raison immédiate que je voudrais sortir en binaire, au lieu d'un fichier de sortie régulière? – ReMaKe