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 :

[debutant] donnees depuis un fichier dans un tableau


Sujet :

C

  1. #1
    Candidat au Club
    Inscrit en
    Août 2006
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 2
    Par défaut [debutant] donnees depuis un fichier dans un tableau
    bonjour,

    grand debutant, je cherche a recuperer des infos depuis un fichier txt avec ./a.out<NomDeFichier.txt
    du style
    12
    1231
    43243
    4324

    alors j'ai tape ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #include <stdio.h>
    int main() {
      char line[10];
      int i, c;
      i=0;
      while((c=getchar()) != EOF)
        line[i] = c;
        printf("%d", line[i]);
      ++i;
    return 0;
    }
    je voulais stocker les lignes dans un tableau (en fait chaques lignes dans un tableau) mais je ne comprend pas pourquoi la valeur de line[i] est 0

    merci de votre aide

  2. #2
    Membre éclairé Avatar de miron
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    479
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 479
    Par défaut
    Citation Envoyé par lolostralie
    bonjour,

    grand debutant, je cherche a recuperer des infos depuis un fichier txt avec ./a.out<NomDeFichier.txt
    du style
    12
    1231
    43243
    4324

    alors j'ai tape ca

    #include <stdio.h>
    int main() {
    char line[10];
    int i, c;
    i=0;
    while((c=getchar()) != EOF)
    { line[i] = c;
    printf("%d", line[i]);
    ++i;}
    return 0;
    }

    je voulais stocker les lignes dans un tableau (en fait chaques lignes dans un tableau) mais je ne comprend pas pourquoi la valeur de line[i] est 0

    merci de votre aide
    Il faut des acolades au While.
    De plus j'utiliserais un for :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
      c = getch();
      for (i=0;c != EOF;i++)
      { 
           line[i] = c;
           printf("%d", line[i]);
           c=getchar();
      }
    Pour terminer

  3. #3
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    La conversion n'est pas automatique:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    long int n=strtol(s,NULL,10);
    printf("%ld\n",n);

  4. #4
    Membre éclairé Avatar de miron
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    479
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 479
    Par défaut
    Citation Envoyé par lolostralie
    je voulais stocker les lignes dans un tableau (en fait chaques lignes dans un tableau) mais je ne comprend pas pourquoi la valeur de line[i] est 0
    /!\ Dans line[0] par ex tu ne peu stocker qu'un seul caractere !
    Par ex:
    2 > line[0]
    3 > line[1]
    a > line[2]
    g > line[3]
    b > line[4]
    etc...

  5. #5
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    Le type doit être "int" car "c" est de type "int".
    Il y n'a pas assez de place pour contenir tous les caractères dans cette série:

  6. #6
    Membre éclairé Avatar de miron
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    479
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 479
    Par défaut
    Citation Envoyé par seriousme
    Le type doit être "int" car "c" est de type "int".
    Il y n'a pas assez de place pour contenir tous les caractères dans cette série:
    Dans ce cas la mon post precedent n'est plus d'actualitée.!

  7. #7
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while((c=getchar()) != EOF)
    La lecture peut se faire par ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    while(fgets(line,sizeof(line),stdin)!=NULL){
    long int n=strtol(line,NULL,10);
    printf("%ld",n);
    }
    if(feof(stdin)){
                    printf("La fin de la liste a ete atteinte.\n");
                   }
    else{
         printf("Une erreur de lecture est survenue.\n");
        }
    Mais avec ce code les différents nombres ne sont pas conservés, "line" ne stocke que le dernier.

  8. #8
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    Par contre si il n'y a pas de fichier en entrée ça risque de poser problème : boucle infinie de lecture.
    Pour remédier à la boucle infinie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    char *check=NULL;      
    while((check=fgets(line,sizeof(line),stdin))!=NULL && (check!=NULL && strcmp(check,"\n")!=0)){
                                          long int n=strtol(s,NULL,0);                                      
                                          printf("%ld\n",n);
                                          }
    Mais c'est lourd et il faut quand même faire au moins un retour à la ligne.

    Pourquoi avec l'autre code ca part en boucle infinie?

  9. #9
    Candidat au Club
    Inscrit en
    Août 2006
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 2
    Par défaut Un grand merci a tous !
    Merci beaucoup pour tous les tuyaux, j'ai galéré une journèe sur ce truc .... mais maintenant ca marche !

  10. #10
    Membre confirmé Avatar de _kal_
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2006
    Messages
    178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2006
    Messages : 178
    Par défaut
    ?


  11. #11
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    Et au fait pourquoi avec ce code ca part en boucle infinie si il n'y a pas de fichier en entrée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    while(fgets(line,sizeof(line),stdin)!=NULL){
    long int n=strtol(line,NULL,10);
    printf("%ld",n);
    }
    if(feof(stdin)){
                    printf("La fin de la liste a ete atteinte.\n");
                   }
    else{
         printf("Une erreur de lecture est survenue.\n");
        }
    ?

  12. #12
    Membre chevronné
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Par défaut
    Hello,

    Citation Envoyé par seriousme
    Et au fait pourquoi avec ce code ca part en boucle infinie si il n'y a pas de fichier en entrée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    while(fgets(line,sizeof(line),stdin)!=NULL){
    long int n=strtol(line,NULL,10);
    printf("%ld",n);
    }
    if(feof(stdin)){
                    printf("La fin de la liste a ete atteinte.\n");
                   }
    else{
         printf("Une erreur de lecture est survenue.\n");
        }
    ?
    Le flux d'entrée est ici stdin, flux ouvert par défaut au début du programme par le runtime et fermé à la fin du programme (et encore, rien ne le garantit). De plus qui souvent n'est pas rattaché à un fichier sur disque ou autre périphérique mais à une console de saisie : donc si c'est une console de saisie, tu n'as pas de EOF explicite et le fgets() ne renvoie jamais NULL tant que le EOF ne sera pas rencontré. Donc il faut forcer le EOF dans la console. Sous Windows, c'est CTRL+Z + {Entrée}. Sinon, en tapant {Entrée} à chaque fois par exemple, fgets() lit la ligne et stocke \n\0 dans le tampon line, mais la boucle continue.

    A+

  13. #13
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    Et y a t'il un moyen de mettre explicitement un "EOF" à l'ouverture de "stdin" sans le faire au clavier?

  14. #14
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Citation Envoyé par seriousme
    Et y a t'il un moyen de mettre explicitement un "EOF" à l'ouverture de "stdin" sans le faire au clavier?
    man ungetc

  15. #15
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Citation Envoyé par gege2061
    Citation Envoyé par man ungetc
    ungetc() pushes c back to stream, cast to unsigned char, where it is
    available for subsequent read operations. Pushed - back characters
    will be returned in reverse order; only one pushback is guaranteed.
    Un cast de EOF vers unsigned char, ca va pas etre joli. De toute facon, envoyer EOF sur stdin automatiquement n'a aucun interet - cela signifie que le programme a ete concus n'importe comment.

  16. #16
    Membre chevronné
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Par défaut
    Hello,

    Citation Envoyé par DaZumba
    Un cast de EOF vers unsigned char, ca va pas etre joli. De toute facon, envoyer EOF sur stdin automatiquement n'a aucun interet - cela signifie que le programme a ete concus n'importe comment.
    Oui.

    D'autre part, d'après la norme :

    [...]
    int ungetc(int c, FILE *stream);
    [...]
    If the value of c equals that of the macro EOF, the operation fails and the input stream is unchanged.
    [...]
    A+

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

Discussions similaires

  1. Compléter une base de donnee depuis une sub dans un fichier Excel
    Par mimi123456789 dans le forum VBA Access
    Réponses: 2
    Dernier message: 24/08/2012, 16h59
  2. Réponses: 2
    Dernier message: 01/10/2009, 15h39
  3. charger un fichier dans un tableau
    Par nico0007 dans le forum Delphi
    Réponses: 3
    Dernier message: 16/01/2007, 23h59
  4. Mettre un fichier dans un tableau
    Par peuf23 dans le forum Langage
    Réponses: 3
    Dernier message: 26/07/2005, 10h47
  5. Réponses: 4
    Dernier message: 10/10/2003, 18h04

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