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 :

Programmer une boucle de saisie chaine de caractère.


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 66
    Par défaut
    je me répond à moi même pour m'excuser ! je suis nouveau et j'ai du faire une bourde !! la réponse n'est pas sur le bon sujet... !

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par benhoeil
    ça dépend du système d'exploitation ! sous DOS, je crois que c'est \13 et sous unix, c'est \10\13.
    Non.
    Je ne sais plus exactement,
    Si tu ne sais pas, ne dit rien ou vérifie...
    mais il y a d'abord un linefeed, puis un cariage return. quand tu tape entrée sous UNIX, tu rajoute donc 2 caractères !! fait bien attention de lire les deux !
    Tu dis de grosses bétises...

    Si tu utilises les fonctions standards et les flux en mode texte, la fin de ligne est '\n' (c'est portable).

    Ce qu'il y a réellement dans les fichiers dépend du système.

    http://emmanuel-delahaye.developpez....s.htm#fichiers

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 66
    Par défaut


    oui je viens de vérifier, tu as raison, et au temps pour moi !!!

    par contre, j'ai souvenir d'un problème de ce genre.

    si j'utilise getc sur stdin (qui est donc une fonction standard) et que je tape "enter" sous dos/win, qu'arrive-t-il ? getc va-t-il me retourner 13 puis 10 ? il me semble que oui. c'est pour ça que j'ai fait la remarque.

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par benhoeil
    si j'utilise getc sur stdin (qui est donc une fonction standard) et que je tape "enter" sous dos/win, qu'arrive-t-il ? getc va-t-il me retourner 13 puis 10 ? il me semble que oui.
    Non. Il va retourner '\n' quelque soit le système. C'est garanti par la définition du langage. Des millions de lignes de code comptent là-dessus.

    Tu confonds avec la façon dont sont marquées les fins de ligne dans les fichiers texte MS-DOS. Mais ça, je l'ai déjà expliqué dans le lien que je t'ai passé.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 66
    Par défaut
    Oui, je viens de vérifier. je suis assez étonné, le bout de code suivant :
    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
     
    #include <stdio.h>
     
    int main(int argc, char **argv) {
    	FILE *fp;
    	int c;
     
    	fp = fopen(argv[1], "r");
     
    	while(!feof(fp)) {
    		c=getc(fp);
     
    		printf("VALEUR %i %c\n", c, c);
    	}
    }
    m'affiche sur un fichier édité sous Windows pour chaque "retour à la ligne" :
    -10 sous Win/DOS (alors qu'en fait, c'est bien 10,13)
    -10 et 13 sous UNIX

    donc, si je comprends, bien que les lignes se termine en 10 puis 13, les functions transforment discrètement en 10. C'est un peu le bordel, mais je suppose que ça assure une portabilité aux codes.

    je viens de faire un autre test avant de poster et si j'ouvre le fichier en mode binaire, j'ai bien 10 et 13 à chaque retour à la ligne.

    en tout cas merci pour ces précisions.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Euh... normalement, un fichier sous DOS a des fins de lignes en 13 puis 10 (CR-LF), et non en 10 puis 13...

    les fonctions de stdio.h ouvrent par défaut en mode texte (les fonctions sans "f" aussi, d'ailleurs), aussi appelé mode transposé: c'est ce mode qui convertit les trois combinaisons possibles (CR (13) pour mac, CR-LF (13-10) pour DOS, 10 (LF ou "NewLine") pour unix) en un même caractère quel que soit la plate-forme.

    Par contre, les fonctions de conio.h renvoient le code ASCII correspondant à la touche, et la touche RETURN (entrée) renvoit le code ASCII de CR (13). (en tout cas, c'est ce qui se passe sous DOS)
    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.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 33
    Par défaut
    en fait la fonction gets() ne suffit pas pour la saisie de chaîne de caractère?

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    NON.

    gets est une fonction qui n'aurait jamais du exister, car elle est la porte ouverte à tous les dépassements de buffer (elle ne permet de spécifier aucune limite)

    Il faut TOUJOURS utiliser fgets à la place.
    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.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 33
    Par défaut
    et fgets s'utilise de la même façon?

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Spike Spiegel
    et fgets s'utilise de la même façon?
    Qu'en pense ton livre de C?

    http://emmanuel-delahaye.developpez....tes.htm#saisie
    http://emmanuel-delahaye.developpez....s.htm#fichiers

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 33
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Citation Envoyé par Spike Spiegel
    et fgets s'utilise de la même façon?
    Qu'en pense ton livre de C?
    Là est le problème: je n'en ai pas encore. Alors, j'essaye de suivre le prof pendant le cours et sachant qu'il va réellement vite, je me retrouve chez moi à essayer de trouver des cours sur le Net. Et biensûr à poser des questions sur ce forum.

    je compte d'ailleurs m'acheter le livre "référence" enfin il paraît, écrit par Brian W. Kernighan et Dennis M. Ritchie.

    En tout cas, le site vers lequel tu me redirige à chaque fois est très bien !

Discussions similaires

  1. scanf : utilisation dans une boucle de saisie
    Par kromartien dans le forum Bibliothèque standard
    Réponses: 4
    Dernier message: 03/12/2007, 23h50
  2. Réponses: 1
    Dernier message: 14/11/2007, 11h53
  3. Réponses: 10
    Dernier message: 18/07/2007, 11h47
  4. [Débutant] Programmer une boucle
    Par driver dans le forum Pascal
    Réponses: 2
    Dernier message: 25/02/2007, 20h59

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