Lire un fichier binaire (jpg) à une chaîne de caractères à l'aide de c++
J'ai besoin de lire un fichier jpg pour une chaîne de caractères. Je veux télécharger ce fichier sur notre serveur, je viens de trouver que l'API nécessite une chaîne de caractères, comme les données de ce pic. J'ai suivi les suggestions dans une ancienne question que j'ai posée Télécharger des images vers un serveur à l'aide de c++ .
int main() {
ifstream fin("cloud.jpg");
ofstream fout("test.jpg");//for testing purpose, to see if the string is a right copy
ostringstream ostrm;
unsigned char tmp;
int count = 0;
while ( fin >> tmp ) {
++count;//for testing purpose
ostrm << tmp;
}
string data( ostrm.str() );
cout << count << endl;//ouput 60! Definitely not the right size
fout << string;//only 60 bytes
return 0;
}
Pourquoi il s'arrête à 60 ans? C'est un étrange personnage à 60, et que dois-je faire pour lire les jpg d'une chaîne de caractères?
Mise à JOUR
Presque là, mais après l'utilisation de la méthode proposée, quand je la réécriture de la chaîne dans le fichier de sortie, il déformée. Savoir que je dois aussi préciser que l'ofstream est en mode binaire par ofstream::binary
. Fait!
Par le moyen de ce qu'est la différence entre ifstream::binary
& ios::binary
, est-il une abréviation pour ofstream::binary
?
ifstream::binary
et ios::binary
, ni même ofstream::binary
. binary
est définie dans le ios_base
classe, qui est la racine de toutes les classes iostream. ios
est un typedef pour basic_ios<char>
, qui est une classe qui se situe entre la ios_base
et istream
/ostream
dans la hiérarchie. J'ai tendance à l'utiliser parce que c'est facile à saisir. Vous pouvez utiliser ios::binary
pour les deux ifstream
et ofstream
. Vous pourriez même utiliser ifstream::binary
pour ofstream
, et vice versa.OriginalL'auteur zoujyjs | 2013-07-11
Vous devez vous connecter pour publier un commentaire.
Ouvrir le fichier en mode binaire, sinon, il faudra drôle de comportement, et le traitement de certains non-caractères de texte de façon inappropriée, au moins sur Windows.
Aussi, au lieu d'une boucle while, vous pouvez simplement lire le fichier en entier d'un seul coup:
OriginalL'auteur Benjamin Lindley
Vous ne devriez pas lire le fichier de chaîne, car il est légal pour un jpg contenir des valeurs qui sont à 0. Cependant, dans une chaîne de caractères, la valeur 0 a une signification particulière (c'est la fin de la chaîne de l'indicateur aka \0). Vous devriez plutôt lire le fichier dans un vecteur. Vous pouvez le faire facilement comme suit:
\0
, unstd::string
pouvez (si vous êtes essentiellement en droit -- unstd::string
n'est pas vraiment le bon choix pour des données binaires).Mais l'api requis une chaîne de caractères:
const string &data: the raw data of the photo to be uploaded
.J'ai édité l'exemple de code pour inclure comment initialiser la chaîne. Il fonctionne de la même manière que le vecteur.
vous ne pouvez pas avoir le choix, et si oui, telle est la vie. Encore quelque chose à garder à l'esprit pour l'avenir (au moins à mon avis).
OriginalL'auteur Borgleader
Essayer d'ouvrir le fichier en mode binaire:
À deviner, vous avez probablement été d'essayer de lire le fichier sur Windows et 61st personnage était probablement 0x26 -- un contrôle-Z, qui (sur Windows) sera considérée comme marquant la fin du fichier.
Aussi loin que la meilleure façon de faire de la lecture, vous vous retrouvez avec un choix entre la simplicité et la vitesse, comme l'a démontré une réponse précédente.
OriginalL'auteur Jerry Coffin