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

Bibliothèque standard C Discussion :

ecrire à un endroit précis une chaine formatée


Sujet :

Bibliothèque standard C

  1. #1
    Futur Membre du Club Avatar de bobyboby
    Inscrit en
    Septembre 2008
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 108
    Points : 8
    Points
    8
    Par défaut ecrire à un endroit précis une chaine formatée
    Bonjour, voila mon problème :

    Je récupère dans des champs de saisie GTK des chaine de caractère. Je veux ensuite ecrire ces chaines bout à bout dans une ligne d'un fichier texte. Seulement j'ai un format à respecter qui est de remplir des ''colonnes" de 5 cases. en gros si je récupere les chaines :

    "1" "125" "35"

    quand j'écris dans mon fichier je voudrais écrire :

    Est ce que vous avez une idée? je pensais me positionner dans le fichier avec fseek a l'emplacement (taille de la colonne - nb de caractères de la chaine) et écrire , mais je ne sais pas bien comment faire. Ou sinon me placer au bout de la colonne (emplacement 5 ou 10 ou 15 ici) et écrire les caractère de droite a gauche puis passer a lacolonne suivante etc...

    je suis un peu perdu alors merci de votre aide

  2. #2
    Expert confirmé Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 364
    Points : 5 378
    Points
    5 378
    Par défaut
    Salut,

    Je pense que tu dois utiliser un sprintf avant, je ne suis plus sûre de la syntaxe. Voici un exemple (j'ai pas testé):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sprintf(ma_ligne,"%5s%5s%5s .....", tes_chaines);

  3. #3
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par fregolo52 Voir le message
    Salut,

    Je pense que tu dois utiliser un sprintf avant, je ne suis plus sûre de la syntaxe. Voici un exemple (j'ai pas testé):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sprintf(ma_ligne,"%5s%5s%5s .....", tes_chaines);
    C'est correct. fprintf() direct devrait suffire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #include <stdio.h>
     
    int main (void)
    {
       char sx[] = "1";
       char sy[] = "125";
       char sz[] = "35";
     
       printf ("    1  125   35\n");
       printf ("%5s%5s%5s\n", sx, sy, sz);
     
       return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        1  125   35
        1  125   35
     
    Process returned 0 (0x0)   execution time : 0.042 s
    Press any key to continue.
    Pas de Wi-Fi à la maison : CPL

  4. #4
    Futur Membre du Club Avatar de bobyboby
    Inscrit en
    Septembre 2008
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 108
    Points : 8
    Points
    8
    Par défaut
    merci ça marche niquel, mais j'ai une nouvelle question :

    mon programme comporte plus d'une centaine de saisies dans ce genre, et l'écriture dans le fichier se fait via une boucle car je me vois mal faire un printf de 3 km de long, ni 100 printf à la suite.

    Le problème c'est que toutes les saisies n'ont pas le même format, certaines doivent s'ecrire dans une colonne de 5, de 2, de 1, de 10 ou autre.

    Je voudrais savoir si il est possible de défénir le format dans fprintf via une variable.

    je pensais par exemple creer un fichier texte avec les tailles de chaque colonnes, lire ce fichier et mettre la taille dans une variable, genre :

    fichier de tailles :
    a chaque ligne lue mettre la valeur dans X et faire ensuite printf("%Xs", chaine)

    possible?

  5. #5
    Expert confirmé Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 364
    Points : 5 378
    Points
    5 378
    Par défaut
    ce que tu dits doit etre faisable en 2 etapes (a tester).

    tu as un sprintf qui construit sont format par ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    sprintf(format_de_chaine, "%%%ds", 5);
    // ce qui devrait donner format_de_chaine = "%5s"
    fprintf(mon_fichier, format_de_chaine, mes_data);

  6. #6
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    Citation Envoyé par bobyboby Voir le message
    merci ça marche niquel, mais j'ai une nouvelle question :

    mon programme comporte plus d'une centaine de saisies dans ce genre, et l'écriture dans le fichier se fait via une boucle car je me vois mal faire un printf de 3 km de long, ni 100 printf à la suite.

    Le problème c'est que toutes les saisies n'ont pas le même format, certaines doivent s'ecrire dans une colonne de 5, de 2, de 1, de 10 ou autre.

    Je voudrais savoir si il est possible de défénir le format dans fprintf via une variable.
    Oui c'est possible, grace à l'étoile (*). Par exemple tu peux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("%*s%*s\n", width_1, var_1, width_2, var_2)
    Attention car si tu utilise la numérotation des arguments (1$, 2$, ...) alors l'ordre des arguments est inversée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("%2$*1$s%4$*1$s\n", width_1, var_1, width_2, var_2)

  7. #7
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par matafan Voir le message
    Attention car si tu utilise la numérotation des arguments (1$, 2$, ...)
    Non standard (le caractère $ ne faut pas partie des caractères standard du C).

    C'est probablement une extension de ton compilateur. A oublier.
    Pas de Wi-Fi à la maison : CPL

  8. #8
    Futur Membre du Club Avatar de bobyboby
    Inscrit en
    Septembre 2008
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 108
    Points : 8
    Points
    8
    Par défaut
    Ca marche vous êtes des pros les gars :p

    Pour les $ de toute façon j'utilise un seul parametre à la fois et je fais une grande boucle pour toutes les saisies.

  9. #9
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Non standard (le caractère $ ne faut pas partie des caractères standard du C).

    C'est probablement une extension de ton compilateur. A oublier.
    Tien effectivement, j'étais pourtant sûr que c'était standard. Pour info c'est supporté par gcc et par xlc.

    Question corollaire : si on ne peux pas utiliser n$ pour numéroter les arguments, comment on fait pour résister à l'internationalisation des messages ? L'ordre des % dans le format d'un printf peut changer quand on traduit le message dans une autre langue.

  10. #10
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par matafan Voir le message
    Tien effectivement, j'étais pourtant sûr que c'était standard. Pour info c'est supporté par gcc et par xlc.

    Question corollaire : si on ne peux pas utiliser n$ pour numéroter les arguments, comment on fait pour résister à l'internationalisation des messages ? L'ordre des % dans le format d'un printf peut changer quand on traduit le message dans une autre langue.
    définir des ID et chercher la chaîne correspondante à l'ID dans un fichier ressource dans la bonne langue.
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  11. #11
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Euh... Ça ne résout pas le problème, ça!
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  12. #12
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    Je ne comprend pas ce que tu veux dire. Pendant que tu répondait j'ai créé une nouvelle discussion sur ce sujet : http://www.developpez.net/forums/d63...tionalisation/

    Peux-tu me donner plus de détail là bas ? Merci.

  13. #13
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Euh... Ça ne résout pas le problème, ça!
    ??

    En ce qui concerne l'internationalisation, relativement si.

    Sachant qu'il y a 3 types d'écriture (de gauche à droite et de haut en bas, de droite à gauche et de haut en bas, de droite à gauche et de bas en haut), on peut généraliser par type de langues...
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  14. #14
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Mais quel que soit leur Id, les chaînes devront toujours avoir les % dans le même ordre, ce qui est le problème soulevé par matafan.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  15. #15
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    si tu fabriques une chaîne descriptive de la chaîne en terme de format, mais en faisant référence aux ID, tu t'en sors

    ID_FORMAT {
    "ID_VOITURE ID_VERTE",
    "ID_VERTE ID_VOITURE"
    }

    après avoir fait un tokenize du format (GetString(ID_FORMAT)), et avoir stocké dans un tableau :

    printf ( "%s%s", GetString(ID(token[0]), GetString(ID(token[1]) );
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  16. #16
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    En effet. Par contre, tu te retrouves à tout formater séparément pour ça.

    (Sous Windows, quand tu en es à ce point, autant utiliser directement FormatMessage(FORMAT_MESSAGE_FROM_STRING), qui permet d'insérer directement des chaînes...)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  17. #17
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    tu peux te faire directement la fonction (portable )...
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  18. #18
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Oui.
    Concaténer des chaînes n'est pas bien difficile, une fois qu'on a délégué le formatage ailleurs.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  19. #19
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    Concaténer des chaines ce n'est jamais une bonne idée quand les chaines sont traduites. Comment être sûr qu'on se retrouve avec des élément dans le bon ordre dans toutes les langues possibles ?

    Vous ne m'avez pas convaincu avec vos solutions. C'est du bricolage, rien ne garenti que ça marchera toujours dans toutes les langues. Beaucoup moins sûr que les n$ de printf.

  20. #20
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Mais quand on fait sa propre fonction d'insertion, on peut faire son propre format, genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "blabla %2; toto %1; je m'amuse à 100%;!"
    Note: Pour supprimer les ambiguités des séquences d'échappement ordinaires, j'utilise le point-virgule comme terminateur, comme xml et cie.
    "%;" est la séquence d'échappement neutre, comme "\\" ou "&amp;"...

    Le problème avec ça, c'est que contrairement à ton extension de printf(), ça n'accepte que les chaînes de caractère (ou bien, il faut utiliser un autre format de paramètres pour spécifier en quoi convertir).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Fonction pour charger une chaine formaté
    Par dxdiag dans le forum Débuter
    Réponses: 5
    Dernier message: 08/02/2008, 21h35
  2. Ecrire à un endroit précis d'un fichier texte
    Par sisco97 dans le forum Langage
    Réponses: 6
    Dernier message: 27/04/2007, 19h44
  3. Ouvrir et ecrire à un endroit précis
    Par titor dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 04/11/2006, 19h31
  4. Ecrire à un endroit précis dans un fichier texte
    Par zemeilleurofgreg dans le forum Delphi
    Réponses: 4
    Dernier message: 26/06/2006, 21h51
  5. ecrire à un endroit précis du disque.
    Par giova_fr dans le forum Windows
    Réponses: 11
    Dernier message: 14/10/2005, 17h46

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