2010-12-12 40 views
0

Lorsque j'essaie d'écrire le fichier en utilisant C; fwrite qui accepte le type void comme données, il n'est pas interprété par l'éditeur de texte.Ecriture dans un fichier en utilisant c et C++

struct index 
{ 
    index(int _x, int _y):x(_x), y(_y){} 
    int x, y; 
} 

index i(4, 7); 

FILE *stream; 
fopen_s(&stream, "C:\\File.txt", "wb"); 
fwrite(&i, sizeof(index), 1, stream); 

mais quand j'essaye avec C++; ofstream write en mode binaire, il est lisible. pourquoi ne vient-il pas le même que écrit en utilisant fwrite?

+1

On dirait que vous avez utilisé 'fwrite' incorrectement. Pouvez-vous poster du code? –

+0

J'ai posté pour 'fwrite'. – user963241

+0

Quel est votre 'stream'? – chrisaycock

Répondre

0

C'est la façon d'écrire des données binaires en utilisant un flux en C++:

struct C { 
    int a, b; 
} c; 

#include <fstream> 
int main() { 

    std::ofstream f("foo.txt",std::ios::binary); 
    f.write((const char*)&c, sizeof c); 
} 

Cela sauvera l'objet de la même manière que le ferait fwrite. Si ce n'est pas le cas, veuillez poster votre code avec des flux - nous verrons ce qui ne va pas.

+0

@Kos J'ai essayé de surcharger f << c, en insérant a puis b. – user963241

+0

Oh, cela explique pourquoi vous avez reçu la sortie de texte. Si vous voulez une sortie binaire brute, vous savez quoi faire maintenant. – Kos

+0

J'ai écrit deux fichiers en utilisant le flux de fichiers C et C++ en mode binaire brut, mais comment se fait-il qu'un fichier écrit en C soit 90% plus grand que celui que j'ai écrit en C++? – user963241

0

L'insertion du flux de flux C++ ne fait que du texte. La différence entre l'ouverture d'un iostream en mode binaire et en mode texte est le temps ou la conversion de caractères en fin de ligne ne se produit pas. Si vous voulez écrire un format binaire où un entier de 32 bits prend exactement 32 bits, utilisez les fonctions c de C++.

Modifier pourquoi fwrite peut être le meilleur choix:

méthode d'écriture de ostream est plus ou moins un clone de fwrite (sauf qu'il est un peu moins utile, car il ne prend que un tableau d'octets et la longueur au lieu de fwrite de 4 params) mais en adhérant à fwrite, il n'y a aucun moyen d'utiliser accidentellement l'insertion de flux dans un endroit et d'écrire dans un autre. Plus c'est moins un mécanisme de sécurité. Tandis que vous gagnez cette marge de sécurité, vous perdez un peu de flexibilité, vous ne pouvez plus créer de dérivé iostream qui compresse la sortie sans modifier le code d'écriture de fichier.

+0

Untrue, les objets stream C++ sont parfaitement adaptés aux données binaires ... Une des raisons de les préférer aux alternatives C est la sécurité liée à la fermeture du fichier dans le destructeur de l'objet. – Kos

+0

@Kos capable vrai mais fwrite fournit la meilleure interface. – stonemetal