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

C++ Discussion :

Lire uine chaîne très longue depuis un fichier *.ini et la stocker dans une variable!


Sujet :

C++

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2013
    Messages : 16
    Points : 21
    Points
    21
    Par défaut Lire uine chaîne très longue depuis un fichier *.ini et la stocker dans une variable!
    Bonjour,

    j'essaye de récupérer une chaîne très longue depuis un fichier *.ini, mais le problème que je n'arrive pas à résoudre que la fonction [ GetPrivateProfileString ] ne rend qu'une partie de la chaîne
    la taille totale de XY dans ma section est de 215382 caractère alors que storedData ne contient que les 18774 premiers caractères.

    Pouvez vous m'aidez SVP.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    	storedData= (char*)calloc(height*width*6*sizeof(char)+100, 1);
    	GetPrivateProfileString("POINTS", "XY", "000000",storedData, 100*height*width*6*sizeof(char)+100,iniPath);

    Cordialement,

  2. #2
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    utilise std::string, et tu n'auras plus de soucis possible.
    un char* est limité à la taille allouée.
    un std::string gère ca tout seul.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2013
    Messages : 16
    Points : 21
    Points
    21
    Par défaut
    Bonjour,

    merci pour la réponse. Mais j'avais l'erreur suivant 'GetPrivateProfileStringA'*: impossible de convertir le paramètre 4 de 'std::string' en 'LPSTR'

    cordialement

  4. #4
    Membre éprouvé Avatar de fenkys
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    376
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 376
    Points : 1 054
    Points
    1 054
    Par défaut
    Bonjour,

    On ne connait pas les types des données que tu as utilisés. Tu n'aurais pas des erreur d'overflow dans tes calculs de taille ?

    L'erreur de compilation est normale. L'API windows, en C, ne connait pas les objets C++.

    Cordialement
    Fenkys

  5. #5
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 031
    Points : 11 379
    Points
    11 379
    Billets dans le blog
    10
    Par défaut
    Citation Envoyé par leternel Voir le message
    utilise std::string, et tu n'auras plus de soucis possible.
    un char* est limité à la taille allouée.
    un std::string gère ca tout seul.
    Autant je suis généralement d'accord avec ce type d'avis, autant là ça dénote d'un manque de connaissance de l'API WIn32.
    En plus ça ne résoudrait même pas le soucis de l'OP.

    Pour en revenir au problème, moi quand je vois ça height*width*6*sizeof(char)+100, je me dis "6 ? Pourquoi 6 ? Et 100 là, pourquoi 100 ?".
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  6. #6
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    En effet, je ne l'ai même pas reconnue. C'est vrai que je ne la connais pas du tout.

    D'un autre coté, je n'ai rien vu dans le message de bileltechno qui la mentionne.

    Par ailleurs, je recommande fortement d'avoir une variable contenant cette taille.
    éventuellement, j'irai créer une class/struct contenant le pointeur et sa taille allouée.
    Et le pas suivant, c'est d'en faire une capsule RAII.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 071
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 071
    Points : 12 116
    Points
    12 116
    Par défaut
    Commencez par vérifier d'où vous vient les trucs que vous récupérez, la base de registre ou un fichier ini ?
    https://msdn.microsoft.com/en-us/lib...or=-2147217396

  8. #8
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 031
    Points : 11 379
    Points
    11 379
    Billets dans le blog
    10
    Par défaut
    GetPrivateProfileString permet de lire une valeur depuis un fichier ini, et de stocker cette valeur dans une chaîne (allouée par l'appelant).
    Quand on met un lien vers une page, on lit au moins ce qui y est écrit...
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par leternel Voir le message
    D'un autre coté, je n'ai rien vu dans le message de bileltechno qui la mentionne.
    C'est juste une méthode clairement dans l'API Win32, sont reconnaissables ces bestiaux

    @op> ton code semble être fait au hasard, y'a rien de bien, rien de logique.
    La doc est on ne peut plus claire à son sujet, à moins que tu ne l'aies même pas ouverte ?
    If neither lpAppName nor lpKeyName is NULL and the supplied destination buffer is too small to hold the requested string, the string is truncated and followed by a null character, and the return value is equal to nSize minus one.
    If either lpAppName or lpKeyName is NULL and the supplied destination buffer is too small to hold all the strings, the last string is truncated and followed by two null characters. In this case, the return value is equal to nSize minus two.
    Par ailleurs, toujours dans cette même doc (décidément, c'est utile à lire!), on peut voir
    The return value is the number of characters copied to the buffer, not including the terminating null character.
    A partir de là, il est très simple de faire une fonction qui lit tout et le retourne en std::string par exemple.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 071
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 071
    Points : 12 116
    Points
    12 116
    Par défaut
    @dragonjoker59, on ne va pas jouer à qui a la plus grosse.
    Faudrait au moins lire en diagonale la page indiquée avant d'écrire qu'on ne l'a même pas lu.

    La lecture dans la base de registre est prioritaire sur la lecture dans fichier.

  11. #11
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par bacelar Voir le message
    La lecture dans la base de registre est prioritaire sur la lecture dans fichier.
    Non, il lit ce que tu lui demandes de lire.
    Pour lire depuis un fichier, il faut juste un "full path to the file". Ce qui veut dire de spécifier ".//myfile.ini" pour lire un fichier ini dans son répertoire d'exécution.
    Si on lui demande n'importe quoi, il cherchera n'importe quoi dans le registre, mais uniquement parce qu'on lui a demandé n'importe quoi.

    En l'occurence, on s'en moque un peu, l'op lit ce qu'il attend mais mal.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

Discussions similaires

  1. Réponses: 9
    Dernier message: 11/06/2015, 11h06
  2. Réponses: 2
    Dernier message: 24/05/2011, 03h18
  3. [Batch] lire dans un fichier et mettre le résultat dans une variable
    Par danydan01 dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 09/06/2010, 12h28
  4. Comment lire un fichier XML et l'écrire dans une variable XML en C#
    Par Bonne Année dans le forum XML/XSL et SOAP
    Réponses: 3
    Dernier message: 21/01/2009, 13h34
  5. Réponses: 0
    Dernier message: 16/01/2009, 15h15

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