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 :

lecture d'un fichier et traitement des données lues


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 165
    Par défaut lecture d'un fichier et traitement des données lues
    Bonsoir à tous,

    je viens faire appel à vous parce que j'ai encore un petit souci.
    Je dois lire un fichier qu'on nous passe en paramètre.
    J'ouvre d'abord ce fichier avec la fonction open qui nous renvoie un entier (file descriptor).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fd = open(argv[i], O_RDONLY);
    Après avoir tester la valeur du fd, pour être sur qu'il n'y ait pas eut de problème. Dans le cas où l'ouverture s'est faite sans aucun problème, je renvoie mon fd pour une lecture du fichier.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    byte_read = read(fd, buffer, BUFFER_SIZE);
    La fonction read renvoie un entier qui représente le nombre d'octet lu, et BUFFER_SIZE est le nombre d'octet à lire. (si j'ai fait une erreur dites le moi svp ).
    Ce que je souhaite faire c'est copier ce que je lis dans une chaine de caractère (donc un char *) ou une tableau de chaîne de caractère (donc un char **). J'hésite entre les deux parce que le fichier comporte plusieurs lignes.
    Je pensais représenter le truc comme ca:

    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
    int   byte_read;
      int   x;
      int   y;
      char  buffer[BUFFER_SIZE];
      char  **chaine;
     
      x = 0;
      y = 0;
      byte_read = 1;
      chaine = malloc(sizeof(**chaine));
      while (byte_read != 0)
        {
          while (buffer !=  ?)
            {
              while (buffer != '\n')
                {
                  byte_read = read(fd, buffer, BUFFER_SIZE);
                  if (byte_read == -1)
                    return (-1);
                  chaine[y][x] == buffer;
                  y++;
                }
              x++;
            }
        }
    Je pensais lire le fichier tant que le buffer n'a pas atteint la fin de la ligne (du fichier) c'est-à-dire '\n' et ceux tant que je n'ai pas atteinds la dernière ligne, et bien sur à chaque ligne je copie ce que j'ai lu.
    x représente le caractère dans la ligne et y le "numéro" de ligne.
    Le code est ma vision mais malheuresement comme ceci je n'arrive pas à faire ce que je veux et je commence à avoir des doutes sur la façon dont j'ai codé.
    Si quelqu'un veut bien me donner un indice d'où est l'erreur

  2. #2
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    un petit tour ici ne te fera pas de mal : http://emmanuel-delahaye.developpez.....htm#tabdyn_2d
    Cordialement.

  3. #3
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    je le redis :
    Citation Envoyé par nicolas.sitbon Voir le message
    un petit tour ici ne te fera pas de mal : http://emmanuel-delahaye.developpez.....htm#tabdyn_2d
    Cordialement.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 165
    Par défaut
    le problème est que je ne peux pas connaitre à l'avance le nombre de colonne M et le nombre de lignes N
    le fichier que je dois lire et reutiliser a une taille variable, d'où mon problème en fait

  5. #5
    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 : 62
    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
    Par défaut
    Peut être que tu peux récupérer la taille de ton fichier une fois que l'ouverture est faite pour allouer ton buffer

    stat() ou fstat() sont tes amies
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 165
    Par défaut
    le problème est que je ne peux pas utiliser des fonction système à moins de le recoder moi même
    je pensais que ma façon de faire me permettrait de "copier" ce qui est lu dans un char * voir un char ** mais au vu des réponses, j'en suis de moins en moins convaincu

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par m0ul3sh0t Voir le message
    J'ouvre d'abord ce fichier avec la fonction open qui nous renvoie un entier (file descriptor).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fd = open(argv[i], O_RDONLY);
    Après avoir tester la valeur du fd, pour être sur qu'il n'y ait pas eut de problème. Dans le cas où l'ouverture s'est faite sans aucun problème, je renvoie mon fd pour une lecture du fichier.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    byte_read = read(fd, buffer, BUFFER_SIZE);
    La fonction read renvoie un entier qui représente le nombre d'octet lu, et BUFFER_SIZE est le nombre d'octet à lire. (si j'ai fait une erreur dites le moi svp ).
    Jusque là ça va

    Citation Envoyé par m0ul3sh0t Voir le message
    Ce que je souhaite faire c'est copier ce que je lis dans une chaine de caractère (donc un char *) ou une tableau de chaîne de caractère (donc un char **). J'hésite entre les deux parce que le fichier comporte plusieurs lignes.
    Tout dépend de ton besoin. Si tu veux
    - lire une ligne
    - traiter la ligne
    - passer à la ligne suivante
    alors c'est un char*

    Si tu veux stocker tout le fichier, c'est alors un tableau de lignes où chaque ligne est un tableau de char d'où un char**

    Citation Envoyé par m0ul3sh0t Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      chaine = malloc(sizeof(**chaine));
    Pb: **chaine est un char donc t'alloues de la place pour un char

    Citation Envoyé par m0ul3sh0t Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    chaine[y][x] == buffer;
                  y++;
                }
              x++;
    Alors si "x" est le n° de la ligne et "y" le n° de colonne faut écrire chaine[x][y] pour être plus logique. Le problème c'est que tu traites chaine comme un tableau à 2d alors que tu lui as alloué de l'espace que pour un seul octet. Si vraiment tu veux faire comme ça, faut partir dans les boucles de malloc et de realloc selon l'algo suivant
    1) a chaque nouvelle ligne, si le nb de lignes dépasse le nb de pointeurs alloués faut réallouer un nb "x" pour stocker les pointeurs sur les nouvelles lignes
    2) chaque ligne, faut allouer un tableau de char que tu stockes dans un des pointeurs alloués en 1
    3) stocker la ligne lue

    Maintenant, si tu dois travailler en termes de "lignes", je te conseillerais d'utiliser fopen + fgets (ou fopen + getline) plus souple que open + read
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 165
    Par défaut
    je ne peux pas travailler ligne par ligne
    je m'explique. Le sujet que je dois faire est: on a un "plateau" de jeu avec des cases et des obstacles. Le but est de créer le plus grand carré possible entre les obstacles.

    Je pensais à un tab[y][x] pour que le x permettent de se déplacer dans la ligne et y dans le numéro de ligne
    J'ai dit une connerie avant, le nombre de ligne nous est donné dans notre fichier à lire (c'est le premier charactère lu)

    je vais me pencher sur ce que tu m'as dit et voir ce que j'arrive à faire

  9. #9
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par m0ul3sh0t Voir le message
    J'ai dit une connerie avant, le nombre de ligne nous est donné dans notre fichier à lire (c'est le premier charactère lu)
    Alors t'as pas besoin de realloc. Tu alloues d'un coup autant de lignes que t'as besoin...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 165
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Alors t'as pas besoin de realloc. Tu alloues d'un coup autant de lignes que t'as besoin...
    mais pour le malloc, tu donnes le nombre de caractères * sizeof(type du caractère) non?

  11. #11
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par m0ul3sh0t Voir le message
    mais pour le malloc, tu donnes le nombre de caractères * sizeof(type du caractère) non?
    Non. Lorsque tu alloues la mémoire tu dis "j'alloue n éléments" (quel que soit "element")
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    element *zone=malloc(n * sizeof(element))
    Une ligne c'est un tableau de caractères donc char *ligne
    Toi tu veux gérer un ensemble de "n" lignes donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char **tabLig=malloc(n * sizeof(char *))
    Là, tu te retrouves avec "n" pointeurs ("n" char*) et chaque pointeur, s'il est lui-même correctement alloué, peut stocker une ligne...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. lecture fichier et classement des données
    Par membreComplexe12 dans le forum C++
    Réponses: 20
    Dernier message: 24/11/2010, 14h55
  2. [MySQL] traitement des données dans un fichier
    Par ramijrad dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 10/08/2010, 13h27
  3. [Formulaires] Traitement des données dans une autre page...
    Par sekiryou dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 04/03/2006, 09h08
  4. traitement des données avant envoie dans MySQL
    Par italiasky dans le forum SQL Procédural
    Réponses: 13
    Dernier message: 07/02/2006, 22h50

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