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 Une Chaine De Caractères


Sujet :

C

  1. #1
    Futur Membre du Club
    Inscrit en
    Septembre 2002
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 11
    Points : 5
    Points
    5
    Par défaut Lire Une Chaine De Caractères
    Lut!

    Soit la fonction main:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    void main()
    {
        char nom[25];
     
        nom[25] = '\0';
        printf("Entrer un nom: ");
     
        ...
    }
    comment lire de stdin une chaine string de longeur 24 charactères seulement et affecter cette chaine à la variable nom ??

    même question si on veux lire à partir d'un fichier texte?

    J'ai recu des erreurs de compilation avec scanf !!

    mci d'avance.

  2. #2
    Membre régulier

    Profil pro
    none
    Inscrit en
    Août 2002
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : none

    Informations forums :
    Inscription : Août 2002
    Messages : 80
    Points : 96
    Points
    96
    Par défaut
    slt,

    Pour une saisie au clavier de 3 caractères :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    char chaine[4];
     
    scanf("%3s",&chaine);
    printf("%s", chaine);
    Pour une lecture de 3 caractères à partir d'un fichier texte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    char chaine[4];
    FILE *fichier;
     
    fichier = fopen("c:/c/days.txt", "r");
    fscanf(fichier,"%3c",&chaine);
    printf("%s", chaine);
    angi.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Décembre 2002
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 29
    Points : 36
    Points
    36
    Par défaut
    je tiens a apporter un petit correctif

    pour commencer, et je re-repete , il est inutile de donner l'adresse d'un buffer pour scanf, car un buffer est en realiter deja une adresse :

    avant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char chaine[4];
     
    scanf("%3s",&chaine);
    printf("%s", chaine);
    apres :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char chaine[4];
     
    scanf("%3s", chaine);
    printf("%s\n", chaine);
    et aussi un petit bug, certes on a bien envie de lire des char, mais ce n'est pas 3c, mais bien s sur une longueur de 3, donc 3s pour le fscanf
    (et toujours pas l'adresse du pointeur, mais le pointeur uniquement )

    avant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    char chaine[4]; 
    FILE *fichier; 
     
    fichier = fopen("c:/c/days.txt", "r"); 
    fscanf(fichier,"%3c",&chaine); 
    printf("%s", chaine);
    apres :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    char    chaine[4];
    FILE    *fichier;
     
    fichier = fopen("c:/c/days.txt", "r");
    fscanf(fichier, "%3s", chaine);
    printf("%s\n", chaine);
    voila ceci uniquement a but pedagogique pour notre ami Jonathan_Korvitch

    Le C est un art qu'il faut deja parfaire avant meme de le connaitre, alors il faut pas lui apprendre a faire des bugs il aura largement le temps en trouver lui-meme
    Fatalis
    "La femme est le chef-d'oeuvre de Dieu, surtout quand elle a le diable au corps" Alphonse Allais

  4. #4
    Futur Membre du Club
    Inscrit en
    Septembre 2002
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    D'accord avec vs Fatalis en ce qui concerne le pointeur, en fait avec la déclaration: char chaine[4]; chaine = &(chaine[0]) par définition du type tableau, c'est tjrs l'adresse du premier élément du tableau!!
    et pr le 3s aussi.

    Pourtant sais-tu comment affecter la valeur retournée par un pointeur à une variable du type unsigned long??

  5. #5
    Membre averti

    Inscrit en
    Juin 2002
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 97
    Points : 307
    Points
    307
    Par défaut
    Précisions:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char chaine[4]; 
    scanf("%3s",&chaine);
    Mettre '&' ici est bien une erreur, mais peu susceptible de faire échouer le code.
    En effet, '%s' attend un 'char*', alors que '&chaine' est de type 'char (*)[4]'.
    La fonction asimplement une liste variable d'arguments qui ne lui permet pas de vérifier les types.

    Et puis:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    scanf("%3s", ... //lire 3 caractères et placer '\0' en 4ème.
    scanf("%3c", ... //lire 3 caractères, c'est tout
    "J'ai toujours rêvé d'un ordinateur qui soit aussi facile à utiliser qu'un téléphone. Mon rêve s'est réalisé : je ne sais plus comment utiliser mon téléphone."-Bjarne Stroustrup
    www.stroustrup.com

  6. #6
    Futur Membre du Club
    Inscrit en
    Septembre 2002
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Salut de nouveau!

    J'ai un fichier texte divisé en enregistrements à taille fixe chacun.
    La création du fichier texte et l'accés à ce fichier était de VB, et l'enregistrement était défini comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Public Type NODE
      Latitude As String * 25
      Longitude As String * 25
      Height As String * 25
     
      Legend As String * 32
      Label As String * 32
      Region As String * 25
     
      CR As String * 2
    End Type
    1.
    Quelle est la meilleure manière de déclarer 2 variables string en C, disons strname1 et strname2, et en faisant l'accès au même fichier fichier texte à partir de C, comment je peut affecter le contenu de "Label" à strname1 et celui de "Region" à strname2 ??

    2.
    Comment je peut lire en C de stdin 2 variables string comme strname1 et strname2 avec la même taille que "Label" et "Region" respectivement ??

    MCI BCP

  7. #7
    Nouveau membre du Club
    Inscrit en
    Décembre 2002
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 29
    Points : 36
    Points
    36
    Par défaut
    dsl, je vais repondre en plusieurs post, mais ainsi ce sera plus claire.

    Citation Envoyé par Jonathan_Korvitch
    Pourtant sais-tu comment affecter la valeur retournée par un pointeur à une variable du type unsigned long??
    tres simple, un pointeur est coder sur 4 octets, un long sur architecture x86 Win32 est aussi coder sur 4 octets, ainsi les bits dans la memoire sont agencer de la meme maniere, donc tu peux utiliser l'operateur de cast, tu fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ...
    long    lng_ptr;
    char    *ptr;  // par exemple un char*
     
    ptr = retour_fonction(truc);
    lng_ptr = (long)ptr;
    printf("ptr       : 0x%X\n", ptr);
    printf("lng_ptr : 0x%X\n", lng_ptr);
    ...
    tu pourra observer que les deux variables contiendront la meme chose, ensuite tu peux rebalancer ton long ailleurs, recaster a l'envers et refaire pointeur un autre pointeur au bon endroit

    anecdote : je me rappel que j'avais ecrit une dll, et mes fonctions partagers devais renvoyer des char*, mais je ne sais pas pourquoi, ca ne voulais pas, impossible de trouver la raison reel, j'ai essayer d'utiliser des void* mais se fut pareil, je me suis dit que celai venais surement des pointeurs, alors dans mes fonctions partager je stoquais les pointeur dans des int, et je les renvoyais, faisais le cast inverse apres l'appel de fonction dans la dll, et ainsi cela tournais niquel... j'en ai deduis que le prob venais des pointeurs, mais je ne sais toujours pas pourquoi...

    tout en est que cet technique fonctionne extremement bien et elle sauve parfois la vie
    Fatalis
    "La femme est le chef-d'oeuvre de Dieu, surtout quand elle a le diable au corps" Alphonse Allais

  8. #8
    Nouveau membre du Club
    Inscrit en
    Décembre 2002
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 29
    Points : 36
    Points
    36
    Par défaut
    Musaran, oui le fscanf("%3c", truc); fonctionne, mais il lit 3 char et s'arrete, le 3s lit les char et place le \0 a la fin du buffer, c'est un petit plus, le %3 est un petit moins qu'on pouvais eviter a notre ami

    mais effectivement ca fonctionne, dsl d'avoir dit que c'etais un "bug", je me suis mal exprimer et je m'en excuse
    Fatalis
    "La femme est le chef-d'oeuvre de Dieu, surtout quand elle a le diable au corps" Alphonse Allais

  9. #9
    Nouveau membre du Club
    Inscrit en
    Décembre 2002
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 29
    Points : 36
    Points
    36
    Par défaut
    je vais te traduire ton type VB en une structure C

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Public Type NODE 
      Latitude As String * 25 
      Longitude As String * 25 
      Height As String * 25 
     
      Legend As String * 32 
      Label As String * 32 
      Region As String * 25 
     
      CR As String * 2 
    End Type
    ceci equivaut en C a une structure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    typedef struct s_node 
    {
      char    Latitude[25];
      char    Longitude[25];
      char    Height[25];
     
      char    Legend[32];
      char    Label[32];
      char    Region[25];
     
      char    CR[2];
     
    } t_node;
    et voila ton type t_node creer tu as de la chance de connaitre initialement la taille de tes strings en VB, car si tu declare des String directement, leur taille est dynamique et gerer par le systeme lorsque le code tourne, mais la c'est pratique car un VarTruc As String * 25 dit que tu declare une variable VarTruc de type String et que cette chaine est prefixer a un maximum de 25 caracteres ainsi c'est exactement similaire a un char VarTruc[25]; (enfin 26 car VB gere tout seul le \0 de fin de chaine et de ne comprend pas dans cette taille, nous, nous aurons a le gerer nous meme)

    et donc ensuite pour lire dans ton fichier, bah tu l'ouvre dans un file descriptor, puis ensuite si tu veux lire les 25 premiers char, tu fait un read de 25, que tu stoque dans var_node.var_truc et ainsi de suite, les 32 prochains chars, tu fait un read de 32 et hop

    j'espere avoir pu t'aider, et si tu as toujours des problemes ou si tu as besoin qu'on approfondisse, dit le nous
    Fatalis
    "La femme est le chef-d'oeuvre de Dieu, surtout quand elle a le diable au corps" Alphonse Allais

  10. #10
    Membre averti

    Inscrit en
    Juin 2002
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 97
    Points : 307
    Points
    307
    Par défaut
    Chance, il ne doit pas y avoir de problème d'alignement ici.
    "J'ai toujours rêvé d'un ordinateur qui soit aussi facile à utiliser qu'un téléphone. Mon rêve s'est réalisé : je ne sais plus comment utiliser mon téléphone."-Bjarne Stroustrup
    www.stroustrup.com

  11. #11
    Futur Membre du Club
    Inscrit en
    Septembre 2002
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    J'ai changé un peu la structure définie:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    typedef struct
    {
    	char Latitude[25];
    	char Longitude[25];
    	char Height[25];
    	char Legend[32];
    	char Label[32];
    	char Region[25];
    	char CR[92];
    }
    NODE, *pNODE;
    La taille de l'enregistrement est alors 256 charactères.

    Ensuite j'ai essayé d'écrire la fonction suivante pr accéder au fichier texte qui est en faite le fichier des noeuds:

    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
     
    pNODE ScanStoreNodes (char *pFileNameNodes, unsigned long nbNodes)
    {
    	pNODE node = NULL;
    	FILE *pFileNodes = NULL;		
     
    	NODE Buf;        
    	unsigned long i = 0;
     
    	gis_error = 0;
     
    	pFileNodes = fopen(pFileNameNodes, "r");
    	if(pFileNodes)
    	{
    		node = (pNODE) calloc (nbNodes , sizeof(NODE));
    		if(node)
    		{
    			//while( fgets(Buf, 256, pFileNodes) )
    			//{
    			//	if( (Buf[0] != '#') && (Buf[0] != ' ') )		
    			//	{											
    			//		node[i].Label = Buf.Label;       
    			//		node[i].Region = Buf.Region;
    			//		i++;
    			//	}
    		   //}
    		}
    		else
    			gis_error = 10002;
    	}
    	else 
    		gis_error = 10000;
     
      return(node);
    }
    Ici je ne sais pas comment lire d'un seul coup l'enregistrement dont la taille est exactement 256 charactères et affecter l'enregistrement lu à une variable de type NODE, qui peut être node[i] ds la fonction ci-dessus ?? Vs pouver m'aider ds les instructions précédées par des // ou ajouter, changer...

    Une petite question, lorsque je declare: char nom[32]
    et de stdin je fait: scanf("%32s", nom); qu'est ce qui ce passe ici ?
    Est ce que le \0 est mis par defaut ds la chaine nom et la taille effective sera 33 ou bien je suis obligé de mettre moi même le \0 ??

    C'est tout pr le moment.
    Mci pr votre assistance.

  12. #12
    Nouveau membre du Club
    Inscrit en
    Décembre 2002
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 29
    Points : 36
    Points
    36
    Par défaut
    alors pour ce qui est de ta lecture, je pense voir ce que tu veux faire, mais je ne suis plus si sur en lisant ton code, enfin bref, en gros ce que j'ai compris c'est que tu as dans un fichier des blocs de 256 octets, que tu voudrais lire, et il match parfaitement avec ta structure...

    donc on devrais lire les blocs de 256, et tout stoquer dans ta structure selon le model du fichier... si cela est ce que tu veux faire, c'est tres simple...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    NODE    receive_file;
     
    fread(&receive_file, sizeof(char), sizeof(NODE), pFileNodes);
    ceci va lire dans ton fichier pFileNodes un total de sizeof(NODE) (256 si je ne m'abuse) char (du au sizeof(char)) et les stoquer a l'adresse de receive_file, autrement dit, il va ecrite directe en memoire (totalement independament de ta structure et de son agencement) les informations a une adresse donner...

    par chance, les donner de ton fichier match pile-poil avec ta structure, ceci aura donc pour effet de remplir ta structure correctement...

    et pous repondre a ta derniere question, ce qui va se passer, et bien c'est quil va t'ecrire se qu'il pourra dans ton buffer, et ce quil ne pourra pas ecrire ne le sera pas, ansi donc la reponse a la derniere question que tu as poser est que ton buffer aura toujours une taille efficiente de 32 octets de long, et ne contiendra pas le caractere \0 de fin de chaine, ce sera a toi de parcour ta chaine avec exactitude afin de ne pas courrir au plantage
    Fatalis
    "La femme est le chef-d'oeuvre de Dieu, surtout quand elle a le diable au corps" Alphonse Allais

  13. #13
    Membre averti

    Inscrit en
    Juin 2002
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 97
    Points : 307
    Points
    307
    Par défaut
    et de stdin je fait: scanf("%32s", nom); qu'est ce qui ce passe ici ?
    Est ce que le \0 est mis par defaut ds la chaine nom et la taille effective sera 33 ou bien je suis obligé de mettre moi même le \0 ??
    Fatalis, c'est pas si simple...
    "%32s" Lire jusqu'à 32 caractère (en s'arrêtant sur espace ou '\n') et placer un '\0' terminal (donc possiblement en 33ème)
    "%32c" Lire exactement 32 caractères quels qu'ils soient, '\n' compris.
    "J'ai toujours rêvé d'un ordinateur qui soit aussi facile à utiliser qu'un téléphone. Mon rêve s'est réalisé : je ne sais plus comment utiliser mon téléphone."-Bjarne Stroustrup
    www.stroustrup.com

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 12
    Dernier message: 06/09/2011, 15h20
  2. lire une chaine de caractères au terminal
    Par tbertrand dans le forum Prolog
    Réponses: 1
    Dernier message: 25/05/2011, 12h19
  3. Faire lire une chaine de caractère
    Par salmoucha dans le forum Multimédia
    Réponses: 1
    Dernier message: 21/12/2009, 02h17
  4. Réponses: 8
    Dernier message: 14/05/2009, 09h26
  5. Réponses: 2
    Dernier message: 06/12/2002, 07h50

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