IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MFC Discussion :

[MFC] Découpage de CString


Sujet :

MFC

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 84
    Par défaut [MFC] Découpage de CString
    Bonjour à tous !

    Dans mon appli, j'ai une CString dans lequel je mets le contenu d'un gros fichier binaire (plusieurs Mo), je souhaite decouper cette CString en plusieurs morceaux de meme taille.
    J'ai donc essayé de faire ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    for (int i = 0;i <= cPostData.getLength();i=i+(1024));
    {
    	cTemp = cPostData.Mid(i,1023);
     
    	leng = cTemp .GetLength();
    	lpStr = cTemp .GetBuffer(leng);
     
    	cTemp .ReleaseBuffer();
    	autreFonction(cTemp);
    }
    Le problème c'est que comme mon fichier est binaire, il contient certainement des "\o" et je pense que ca fait deconner le .Mid().

    Ya t'il un autre moyen de découper les CStrings ?

    Merci d'avance

  2. #2
    Membre chevronné
    Avatar de matazz
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    471
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 471
    Par défaut
    Si il est binaire, tu pourra pas le faire avec CString ( en tout cas de façon simple...) moi je te conseille un BYTE * par allocation puis des memcpy de 1024....

  3. #3
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut Re: [MFC] Découpage de CString
    Citation Envoyé par MrMaze
    Bonjour à tous !

    Dans mon appli, j'ai une CString dans lequel je mets le contenu d'un gros fichier binaire (plusieurs Mo), je souhaite decouper cette CString en plusieurs morceaux de meme taille.
    J'ai donc essayé de faire ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    for (int i = 0;i <= cPostData.getLength();i=i+(1024));
    {
    	cTemp = cPostData.Mid(i,1023);
     
    	leng = cTemp .GetLength();
    	lpStr = cTemp .GetBuffer(leng);
     
    	cTemp .ReleaseBuffer();
    	autreFonction(cTemp);
    }
    Le problème c'est que comme mon fichier est binaire, il contient certainement des "\o" et je pense que ca fait deconner le .Mid().

    Ya t'il un autre moyen de découper les CStrings ?

    Merci d'avance
    je vois deux pb a ton code le test de la borne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    i <= cPostData.getLength()
    c'est plutot i<cPostData.getLength()
    et l'incrementation systematique de 1024 sans savoir si i+1024 < cPostData.getLength()
    meme chose pour le mid.

    sinon la CString peut contenir des zones binaires .
    quel est la nature du probleme?
    (a mon avis tu en as deja un avec ce que j'ai dis) .


  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 84
    Par défaut
    Tu as raison pour les problèmes mais meme en les corrigeant ça ne marche pas.
    Mon problème en fait c'est que quand je fais cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    for (int i = 0;i <leng;i=i+count+1);
    {
    	int count = 1023;
    	if (count+i > leng)
    		count = leng - i -1;
     
    	cTemp = cPostData.Mid(i,count);			
     
    	CString toto ;
    	toto.Format("Longueur cTemp : %i",cTemp.GetLength());
    	MessageBox(toto);
     
    	autrefonction(temp);
    }
    j'obtiens une longueur de 0.
    Tu ne penses pas que cela vient du fait que cTemp contient du binaire ?

  5. #5
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    re,plutot comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    cTemp = CString(cPostData.Mid(i,count),(count -i)+1);
    pour eviter le test du zero ...


  6. #6
    mat.M
    Invité(e)
    Par défaut
    Dans mon appli, j'ai une CString dans lequel je mets le contenu d'un gros fichier binaire (plusieurs Mo), je souhaite decouper cette CString en plusieurs morceaux de meme taille.
    Pour découper soit prendre une scie à égoïne soit une scie sauteuse


    Je ne procéderrai pas du tout comme cela;
    Il ne faut pas prendre CString mais CStringList pour mémoriser un ensemble de chaînes voire CMap qui est la classe par excellence pour faire un dictionnaire de données

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 84
    Par défaut
    j'avais voulu un peu simplifier mon code pour vous l'afficher mais voila ma fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    ifstream file (filename, ios::in|ios::binary|ios::ate);
    size = file.tellg();
    file.seekg (0, ios::beg);
    buffer = new char [size];
    file.read (buffer, size);
    file.close();
    cPostData =	"--AaB03x\r\nContent-Disposition: form-data; name=\"uploadFile\"; filename=\""+cFile+"\"\r\nContent-Transfer-Encoding: binary\r\nContent-Type: application/octet-stream\r\n\r\n"+CString(buffer,size)+"\r\n--AaB03x--";
     
    int leng = cPostData.GetLength();
    bResults = WinHttpSendRequest(	hRequest, 
    		WINHTTP_NO_ADDITIONAL_HEADERS, 0,
    		WINHTTP_NO_REQUEST_DATA, 0, 
    		leng, 0);
     
    int count = 1023;
    if (bResults)
    {
    	for ( int cpt = 0; cpt < leng ; cpt=cpt+count+1)
    	{
    			CString toto ;
    			if (count+cpt > leng)
    			{
    				count = leng - cpt;
    			}
    			cTemp = CString(cPostData.Mid(cpt,count),count+1); 
     
    			int longueur = cTemp.GetLength();
    			LPTSTR lpStr = cTemp.GetBuffer(longueur);
    			cTemp.ReleaseBuffer();
     
    			toto.Format("leng  : %i , Count : %i , Longueur cTemp : %i",leng,count,longueur);
    			OutputDebugString(toto);	
     
    			bResults = WinHttpWriteData( hRequest, lpStr, longueur, NULL);
    	}
    }
    En fait je veux decouper le cPostData et envoyer chaque partie (pour pouvoir faire une progressbar).
    Avec la fonction winHttpwrite data je dois envoyer des données au format LPTSTR donc je pensais que les CStrings était la meilleure solution, vous pensez qu'il y a mieux ou plus simple ?

  8. #8
    mat.M
    Invité(e)
    Par défaut
    Non j'ai dit d'utiliser CStringList plutôt que CString !!
    Une CString doit être limitée à 1024 charactêres dans le cas contraire ce n'est pas bon ça risque de fragmenter la mémoire
    Il faut analyser le tampon reçu , enlever les espaces et ranger les chaînes dans une liste de CString comme CStringList !

  9. #9
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    Une CString doit être limitée à 1024

    http://c.developpez.com/faq/vc/?page...ns#CStringSize

  10. #10
    mat.M
    Invité(e)
    Par défaut
    La longueur maximale est donc égale à INT_MAX -1 avec INT_MAX = 2147483647 Soit 2 G° .
    franchement Farscape dans un projet tu vas créer des chaînes de plus , ne serait-ce q'un Méga ???

    Pas très sérieux

  11. #11
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    Salut, moi non (encore que peut etre a l'insu de mon plein gré ),je ne fais que donner l’information je ne porte pas de jugement.
    Mais je pense que l’on serait surpris du nombre d’application faisant des allocations mémoires supérieurs au méga pour tenir en mémoire des informations.

  12. #12
    Membre chevronné
    Avatar de matazz
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    471
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 471
    Par défaut
    ben moi je peut te dire qu j'utilise des CString jusqu'a 50 Megs!!!!

  13. #13
    mat.M
    Invité(e)
    Par défaut
    je ne fais que donner l’information je ne porte pas de jugement.

    ok Farscape je crois que l'on ne s'est pas compris
    Je ne voulais pas porter un "jugement" au sens où on l'entend habituellement mais plutôt une contre-indication technique


    Citation Envoyé par matazz
    ben moi je peut te dire qu j'utilise des CString jusqu'a 50 Megs!!!!
    faut pas venir pleurer si après ça pompe des ressources et de la mémoire.
    Et en passant avec Boundschecker par derrière ça donne quoi ?

  14. #14
    Membre chevronné
    Avatar de matazz
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    471
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 471
    Par défaut
    ben quand tu à besoin de lire des fichiers textes de plusieurs centaines de méga (voire plus d'un Giga) et que tu doit le lire caractère par caractère, il y'as pas 36 solutions, cela dit c'est vrai que c'est pas un prog qui est censé être exécuté par des utilisateurs, mais sur un serveur local...

  15. #15
    mat.M
    Invité(e)
    Par défaut
    Citation Envoyé par matazz
    ben quand tu à besoin de lire des fichiers textes de plusieurs centaines de méga (voire plus d'un Giga) et que tu doit le lire caractère par caractère, il y'as pas 36 solutions, cela dit c'est vrai que c'est pas un prog qui est censé être exécuté par des utilisateurs, mais sur un serveur local...
    ah ce moment-là il serait conseillé de passer par des API spécifiques de mémoires comme GlobalAllloc et autre parce que dans le cas contraire la mémoire risque d'être fragmentée

  16. #16
    Membre chevronné
    Avatar de matazz
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    471
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 471
    Par défaut
    Je sens que je vais apprendre un truc :

    c'est quoi la différence entre et un ??
    hors mis le fait que tu peut partager la mémoire...

  17. #17
    mat.M
    Invité(e)
    Par défaut
    je pense que c'est sensiblement la même chose ; mais GlobalAlloc a des méchanismes de plus haut niveau que malloc
    Avec GlobalAlloc la mémoire peut en théorie être déplacée en passant GMEM_MOVEABLE comme paramétre
    Est-ce que malloc le fait j'en doute.

  18. #18
    Membre chevronné
    Avatar de matazz
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    471
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 471
    Par défaut
    Ben je connaissais pas !!!
    Par contre je sais pas si ça intéresse MrMaze...

  19. #19
    mat.M
    Invité(e)
    Par défaut
    eh bien tout est "expliqué" dans le MSDN ; je dis "expliqué" parce que c'est vrai que c'est pas intuitif

Discussions similaires

  1. Réponses: 11
    Dernier message: 08/02/2006, 22h31
  2. [MFC] Limitation des CString
    Par Aradesh dans le forum MFC
    Réponses: 2
    Dernier message: 15/04/2005, 10h40
  3. Réponses: 2
    Dernier message: 04/03/2005, 12h00
  4. Réponses: 7
    Dernier message: 16/11/2004, 15h45
  5. [MFC][WinCE] Longueur maxi de CString?
    Par Sunny dans le forum MFC
    Réponses: 3
    Dernier message: 28/01/2004, 14h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo