2009-08-29 1 views
6

J'ai une image jpeg dans un tampon char [] en mémoire, tout ce que j'ai à faire est de l'écrire sur le disque exactement tel quel. En ce moment je fais cePourquoi la méthode C++ ofstream write() modifie-t-elle mes données brutes?

ofstream ofs; 
ofs.open(filename); 
ofs.write(buffer, bufferLen); 
ofs.close(); 

mais l'image ne vient pas juste, il semble brouillé avec des rayures noires et blanches au hasard partout. Après avoir comparé l'image avec l'original dans une visionneuse hexadécimale, j'ai découvert que l'ofstream modifie les données quand il pense que j'écris un caractère de nouvelle ligne. Chaque fois que 0x0A apparaît dans l'original, l'ofstream écrit comme deux octets: 0x0D0A. Je dois supposer que l'ofstream a l'intention de convertir de LF seulement en CRLF, y a-t-il un moyen standard de l'empêcher de le faire?

Répondre

9

Vous devez définir le mode de fichier à binary lorsque vous êtes opening il:

std::ofstream file; 
file.open("filename.jpg", std::ios_base::out | std::ios_base::binary); 

De cette façon, le flux doesn Essayez d'ajuster les nouvelles lignes à votre format de texte natif.

5

Essayez d'ouvrir l'ofstream en tant que binaire. Quelque chose comme cela devrait fonctionner:

ofstream ofs; 
ofs.open(filename, ios::out | ios::binary); 
ofs.write(buffer, bufferLen); 
ofs.close(); 
1

Puisque vous n'êtes pas ouvrir le fichier en mode binaire, il est réglé sur la sortie formatée par défaut. Dans une sortie formatée, votre implémentation effectue la conversion des caractères de fin de ligne comme vous le décrivez.

-2

J'aimerais pouvoir obtenir ma version pour écrire quoi que ce soit ... aucune erreur, aucune plainte, rien de mal quand vous le déboguez mais il n'essaye même pas de créer le fichier. Qu'est-ce qui n'allait pas avec fopen, fwrite et fclose ... Je n'ai jamais eu de problème avec eux