Membres inscrits :668
Membres en ligne : 0
Invités en ligne : 9


|
| Conversation : lire la total d'un fichier en memoire |
sajaris (Membre)
Inscrit le : 23-11-2010
Messages: 47
Snippets: 0
Tutoriels: 0
Hors ligne |
Bonjour,
je desire lire la totalité d'un fichier et le mettre en memoire. seulement ca marche pas. le code
Code Cpp: file.Open(_("cv.pdf"),wxFile::read); cvsize=file.Length(); wxMessageBox(wxString::Format(_("%u"),cvsize)); cvdata=new char[cvsize+1]; file.Read(cvdata,cvsize); wxMessageBox(wxString::Format(_("%u"),(strlen(cvdata)))); file.Close();
les deux fois ou j'affiche la taille ne corresponde pas du tout....
je sais pas comment m'y prendre
Dernière modification par sajaris (02-09-2011 18:53:51)
| |
|
etrange02 (Membre)
Inscrit le : 24-07-2009
Messages: 23
Snippets: 0
Tutoriels: 0
Site web
Hors ligne |
Peut-être que wxTextFile peut t'aider. Sinon, tu as aussi les streams et dérivées (je pense à wxFileInputStream en particulier).
Dernière modification par etrange02 (02-09-2011 18:10:08)
|
Logiciel en cours de codage, page web en cours de construction = beaucoup de travail !
|
sajaris (Membre)
Inscrit le : 23-11-2010
Messages: 47
Snippets: 0
Tutoriels: 0
Hors ligne |
ca marche pas avec wxFileInputStream, les taille ne correspondent toujours pas
file.Open(cvpath,wxFile::read); cvsize=file.Length(); file.Close(); wxMessageBox(wxString::Format(_("%u"),cvsize)); cvdata=new char[cvsize+1]; wxFileInputStream fin(cvpath); fin.Read(cvdata,cvsize); wxMessageBox(wxString::Format(_("%u"),(strlen(cvdata)))); ---------- desolé de remonter le post mais je doit rendre un projet demain et je dois pouvoir regler cela, si une ame charitable peut bien m'aider
Dernière modification par sajaris (02-09-2011 22:53:25)
| |
|
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 1191
Snippets: 23
Tutoriels: 6
Site web
Hors ligne |
Hello.
Tout d'abord, si je me réfère au premier post du topic, il est tout à fait normal que la deuxième wxMessageBox ne t'affiche pas la bonne taille : tu charges le contenu d'un fichier pdf en mémoire, et tu récupères la longueur des données lues avec la fonction strlen. Or, cette dernière te donne la longueur entre le début des données lues, et le premier caractère "zéro" qu'elle rencontre. Et comme le pdf n'est pas un format "texte" (ouvres-en un avec le bloc notes, tu verras), le résultat ne peut pas être bon.
Par contre, la première version devrait être bonne (j'ai vérifié avec plusieurs fichiers, et ça marche).
Le seul problème que j'ai rencontré, c'est un "assert" venant du format utilisé pour l'affichage. J'ai donc adapté un peu le code :
Code wxWidgets:wxString sMsg=_T("Taille du fichier : "); sMsg << file.Length() << _T(" octets."); wxMessageBox(sMsg);
Avec ce code, j'obtiens bien la bonne taille.
@+ Xav'
|
Le nouveau portail wxWidgets francophone : www.wxdev.fr Ben en fait, vous y êtes déjà...
|
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 1191
Snippets: 23
Tutoriels: 6
Site web
Hors ligne |
En fait, le problème que tu rencontres avec la première wxMessageBox vient peut-être du format utilisé pour l'afficher.
La valeur retournée par wxFile::Length() est de type wxFileOffset. Et la taille de ce type varie en fonction du système : Ça peut être un "unsigned long" ou un "unsigned long long".
Dans mon cas (Windows 7 64bits - wxWidgets 2.9.2 64 bits) c'est la deuxième version qui est la bonne.
Pour l'afficher correctement avec wxString::Format, il faut que je mette :
Code wxWidgets:wxMessageBox(wxString::Format(_T("Taille du fichier : %llu octets."), file.Length()));
Fait une vérif avec "sizeof(wxFileOffset)", tu verras bien.
@+ Xav'
|
Le nouveau portail wxWidgets francophone : www.wxdev.fr Ben en fait, vous y êtes déjà...
|
sajaris (Membre)
Inscrit le : 23-11-2010
Messages: 47
Snippets: 0
Tutoriels: 0
Hors ligne |
merci de la reponse,c'est ok. coolll ! ---------- je revient pour ajouter une petite remarque:
J'arrive maintenant a envoyer la bonne taille au serveur et aussi les donnees du fichier pdf (en fait jefais une application client/serveur en c++ avec la base de donnees mysql)
Maintenant, j'ai cree une table employe avec des champs BLOB pour enregistrer les photo et les cv. le probleme est que pour certain fichier PDF il refuse car il y a des " dans les donnees que j'envoi au serveur.
Alors que dans ma requete sql je met deja des quote ", donc c'est comme si les quote se refermais.
comment échapper les " du pdf ou de l'image jpeg et cela n'altère t'il pas les donnees apres?(au moment de reafficher le pdf ou la photo)
Est ce la bonne méthode pour sauvegarder les fichier cv et photo?
sauvegarder les pdf et photo en fichier sur le disque sur le serveur avec des noms specifiques et mettre le chemin des fichiers dans un champ cv varchar plutot que les donnees dans un champ cv blob serait la meilleur methode?
Merci de me repondre et aussi de m'orienter.
Dernière modification par sajaris (03-09-2011 19:06:56)
| |
|
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 1191
Snippets: 23
Tutoriels: 6
Site web
Hors ligne |
Salut.
La méthode la plus simple qui me vient à l'esprit pour passer outre ce genre de problème est la conversion en base 64. C'est d'ailleurs le principe qui est utilisé pour les pièces jointes dans les mails. Le seul inconvénient, c'est que ça t'augmente la taille des données à transférer. Dans le principe : tu prends 3 octets du fichier à transférer, et tu les codes sur 4 octets. Au final, tu obtiens une suite de caractères (ASCII) que tu pourras aisément enregistrer en varchar, par exemple. http://fr.wikipedia.org/wiki/Base64
Et il me semble bien que la version 2.9.x de wxWidgets intègre le nécessaire pour l'encodage et le décodage (mais pas la version 2.8.x)
@+ Xav'
|
Le nouveau portail wxWidgets francophone : www.wxdev.fr Ben en fait, vous y êtes déjà...
|
|