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 :

Pourquoi le retour arriere \b ne fonctionne pas avec la fonction fprintf ?


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Octobre 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Distribution

    Informations forums :
    Inscription : Octobre 2011
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Pourquoi le retour arriere \b ne fonctionne pas avec la fonction fprintf ?
    Bonjour à tous !

    J'ai besoin d'un petit coup de main pour me débloquer sur une petite appli que je veux dévellopper, surment une question de 2 minutes pour quelqu'un qui n'a pas oublié ses vieux cours de Dev...

    Voila mon problème :

    Je voudrais utiliser Avec la fonction fprintf le \b pour effectuer un retour arriere.

    Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fprintf(MonFichierTXT, "une petite phrase 123 \b\b\b\b");
    Je voudrais que le résultat dans MonfichierTXT.txt soit :

    "une ptite phrase "
    Cependant avec fprintf le \b ne fonctionne pas , j'obtiens à la place dans mon fichier texte un petit carré noir qui indique un caratère non affichable je pense...

    Si je ne dis pas de bétises, \b fonctionne avec printf, et comme fprintf est identique à printf sauf qu'il n'écrit pas à l'écran mais dans un fichier, cela devrait fonctionner non ??? :S

    Donc voila ma question : Quel caractère doit-on mettre dans fprintf pour effectuer un retour arriere ??

    Merci !

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    Ce que tu veux faire, sauf erreur de ma part, ne marche que lors d'un affichage sur écran.
    Il me semble que seul le "\n" est modifié lors de l'écriture dans un fichier. Par exemple sous Windows :
    Ecrire "\n" dans un fichier ouvert avec fopen (avec l'argument "w"), écrit "\r\n".
    Ecrire "\n" dans un fichier ouvert avec fopen (avec l'argument "wb"), écrit "\n"

    Pourquoi ne pas supprimer "123" avant d'écrire la chaine dans le fichier ?

  3. #3
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Citation Envoyé par dim-itri Voir le message
    Si je ne dis pas de bétises, \b fonctionne avec printf, et comme fprintf est identique à printf sauf qu'il n'écrit pas à l'écran mais dans un fichier, cela devrait fonctionner non ??? :S
    Oui, sauf que le curseur de l'écran est "'intelligent", il est capable de revenir en arrière pour écraser ce qu'il vient d'écrire. Dans un fichier, il n'y a pas cette "intelligence" et le caractère \b est écrit comme un carré noir, il n'est pas interprété.

    Citation Envoyé par dim-itri Voir le message
    Donc voila ma question : Quel caractère doit-on mettre dans fprintf pour effectuer un retour arriere ??
    Aucun, tu ne peux pas.

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Octobre 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Distribution

    Informations forums :
    Inscription : Octobre 2011
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    En faite pour être précis, je cherche à dévellopper une application qui "automatise" la création d'un fichier de configuration pour borne WIFI CISCO, en se basant sur un fichier txt model, et en changeant à l'intérieur différents parametres (SSID, clé de cryptage, channel d'emission...).

    Mon fichier de configuration est au format .txt, et je peux l'injecter dans mes bornes à l'aide du port série de l'ordinateur.

    Je cherche donc de dévellopper une application qui permet de générer des fichiers de configuration plus facilement, du genre avec quelques champs-texte sur l'interface pour entrer mes informations, et qu'il aille directement les ajouter dans mon fichier aux bons endroits.


    Donc en faite il n'y a pas question de "une petite phrase 123".

    Je cherche à extraire chaques lignes de configuration de mon fichier, ajouter fprintf(" ma ligne de conf ");
    Le "123" a effacer est en faire le retour arriere invisible à chaque fin de ligne de mon fichier de conf, sinon j'obtiens :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    fprintf("ma ligne de conf
    );
    du fait qu'il y a deja un retour arriere a chaque fin de ligne dans mon fichier...


    Je cherche à générer un fichier avec des fprintf a chaque ligne, comme ca j'ajouterai à chaque ligne à modifier mes arguments, et j'aurai enfin mon fichier de base pour créer des fichiers de configurations...



    J'éspère que vous me suivez ^^

    J'ai réussi cette étape avec ce code :

    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
    FILE *fichier_cree;
        FILE *fichier_lu;
        char ligne_lu[512];
     
     
        if((fichier_cree = fopen("test.txt","w+")) == NULL){
            Label1 -> Caption = "NOOK";
        }
        else{
            Label1 -> Caption = "OK";
        /***********************************************/
        /***********************************************/
     
        fichier_lu = fopen("lecture.txt","r");
     
        while(fgets(ligne_lu,101,fichier_lu) != NULL){
            fprintf(fichier_cree,"fprintf(\"");
            fwrite(ligne_lu,1,(strlen(ligne_lu)-1),fichier_cree);
            fprintf(fichier_cree,"\");\n");
        }
     
     
         fclose(fichier_lu);
         fclose(fichier_cree);
        }
    J'obtiens avec ce code, par exemple avec ce texte en entré :

    version 12.3
    no service pad
    service timestamps debug datetime msec
    service timestamps log datetime msec
    service password-encryption
    hostname FR07967WLES22
    ceci en sortie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    fprintf("version 12.3");
    fprintf("no service pad");
    fprintf("service timestamps debug datetime msec");
    fprintf("service timestamps log datetime msec");
    fprintf("service password-encryption");
    fprintf("!");
    fprintf("hostname FR07967WLES22");
    Aprés il ne me réstera plus qu'a modifier les quelques lignes où des paramètres changent d'un site à un autre, en les remplacants par des variables, je mettrais ce code dans un programme et je pourrai générer des fichiers facilements...


    Je pense que pour tout bon dévelloppeur ma méthode doit être archi-nul mais bon je ne vois pas comment faire autrement avec mon niveau en dev :S



    Maintenant j'ai un nouveau soucis !! ^^


    Avec mon résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    fprintf("version 12.3");
    fprintf("no service pad");
    fprintf("service timestamps debug datetime msec");
    si je rééxecute ce code, il va m'afficher :

    version 12.3no service padservice timestamps debug datetime msec

    Comment faire pour ajouter un \n en fin de ligne dans mon fichié généré, sans l'executer, pour avoir au final dans mon fichier texte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    fprintf("version 12.3\n");
    fprintf("no service pad\n");
    fprintf("service timestamps debug datetime msec\n");
    En gros rendre le \n en gras dans le code suivant non executable (afin de l'afficher tel quel)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while(fgets(ligne_lu,101,fichier_lu) != NULL){
            fprintf(fichier_cree,"fprintf(\"");
            fwrite(ligne_lu,1,(strlen(ligne_lu)-1),fichier_cree);
            fprintf(fichier_cree,"\");\n\n");
        }
    Compliqué compliqué.. ^^

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Octobre 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Distribution

    Informations forums :
    Inscription : Octobre 2011
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Voila !

    avec ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    while(fgets(ligne_lu,101,fichier_lu) != NULL){
            fprintf(fichier_cree,"fprintf(\"");
            fwrite(ligne_lu,1,(strlen(ligne_lu)-1),fichier_cree);
            fprintf(fichier_cree,"\\");
            fprintf(fichier_cree,"n\");\n");
        }
    J'obtiens en sortie dans mon fichier texte généré :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    fprintf("version 12.3\n");
    fprintf("no service pad\n");
    fprintf("service timestamps debug datetime msec\n");
    fprintf("service timestamps log datetime msec\n");
    fprintf("service password-encryption\n");
    fprintf("!\n");
    fprintf("hostname FR07967WLES22\n");
    fprintf("!\n");
    ....
    ...
    ..
    .
    Et par exemple maintenant pour la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fprintf("hostname FR07967WLES22\n");


    Je peux la modifier pour :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fprintf("hostname %s\n", HOSTNAME);
    du coup en générant tout ce sa devrait me donner mon fichier de configuration correctement écris, et avec les paramètres que je voudrais.

    Je n'ai plus qu'a bosser 2 ans pour terminer entierement mon idée (minimum ), aprés je pourrais bosser plus vite au travail ^^


    -> CORRECTION !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    while(fgets(ligne_lu,101,fichier_conf_base) != NULL){
            fprintf(fichier_conf_cree,"fprintf(fichier_conf_cree,\"");
            fwrite(ligne_lu,1,(strlen(ligne_lu)-1),fichier_conf_cree);
            fprintf(fichier_conf_cree,"\\");
            fprintf(fichier_conf_cree,"n\");\n");
        }
    Sinon dans ma fonction fprintf généré dans le fichier texte, il manque le nom du fichier dans lequel re-insérer la conf ^^

    Usine à gaz ...

    Sinon il n'y aurait pas une méthode plus simple ???


    Du genre ouvrir un fichier, rechercher où se trouve le mot "ADRESSEaENTRER", et le remplacer par exemple par 128.0.0.1 ??

    J'éspère ne pas vous avoir déja fait fuir !

  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 : 46
    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
    Pour répondre à ta question initiale, fprintf affiche bêtement la chaine qui lui est passée, et en C la chaise "\b" représente simplement un backslash (0x5c) suivi d'un b (0x74). A la différence de "\t" par exemple, qui représente une tabulation (0x09) et pas un backslash suivi d'un t. C'est le langage C qui veut ça.

    Si tu veux revenir en arrière il faut afficher un 0x08. Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("toto%ctiti\n", 0x8);
    Edit : hmm à part ça je viens de parcourir ton gros message un peu plus haut. Je ne suis pas sûr d'avoir compris ce que tu cherches à faire, mais je n'ai pas l'impression qu'afficher des backspaces puisse être la solution à ton problème. Les caractères backspace (0x8) sont interprétés par la console ou le terminal. C'est ton émulateur de terminal qui décide d'effacer le caractère précédent lorsqu'il voit un 0x8. Si tu écris dans un fichier, ça ne fera qu'écrire un 0x8 dans le fichier ; ça ne reculera évidemment pas d'une case dans ton fichier. Pour te déplacer dans ton fichier tu peux utiliser fseek().

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Octobre 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Distribution

    Informations forums :
    Inscription : Octobre 2011
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Bonjour !

    Merci pour votre réponse, au final j'ai réussi a créer ma petite appli.
    En faite l'appli m'aide maintenant à réaliser des fichiers de configuration pour point d'acces WIFI CISCO.

    Nous fournissons beaucoups d'AP vers un gros client, qui ont a quelques choses pret la même configuration les une des autres (seul le nom de la borne, l'adresse IP, les SSID, channal d'emission, clé de sécurité changent)

    Mon application récupère un fichier de configuration de base spécifique au client (sans nom, sans adresse IP ect), il le traite selon les paramètres que je lui indique (nombre de bornes, nom de site, IP, AP à exclure, ect ect...) et créer lui même les fichiers de configuration.





    Voila !!!


    Maintenant je vais essayer de faire évoluer mon application pour traiter tout les différents clients (choisir le fichier de base et les variables a insérer), pour ne plus a avoir configurer manuellement les centaines de point d'acces.

Discussions similaires

  1. [XL-2007] Code pour selection de cellules qui ne fonctionne pas avec la fonction "Locked"
    Par coco.on.off dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 28/07/2014, 18h01
  2. Réponses: 0
    Dernier message: 10/04/2008, 00h45
  3. Réponses: 11
    Dernier message: 02/10/2007, 11h11
  4. Réponses: 7
    Dernier message: 24/01/2006, 11h03
  5. window.resizeTo ne fonctionne pas avec firefox?
    Par FrankOVD dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 28/06/2005, 15h07

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