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 :

probleme de fichier


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2011
    Messages : 14
    Par défaut probleme de fichier
    Bonjour,

    j ai un fichier texte qui contient des entiers. Je dois le parcourir et le mettre dans un tableau a deux dimension.
    Donc, je parcours le fichier ligne par ligne et je récupère les données, puis je le met dans un tableau de deux dimension.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    fgets(szbuff,MAX_CHAR_PER_LINE,m_File);
     
    token = strtok(szbuff,SEP);
    exemple fichier texte

    sa donne a la console
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    1 2 3 0
    0 3 0 0
    1 3 3 3
    j'ai réussi a le faire, mais mon problème, c est que si j'ai une ligne ou il ne contient aucun entier, je ne veux pas la prendre, exemple

    sa donne a la console

    mais moi sa me donne
    et je ne veux pas sa, je veux ignorer les lignes vides,


    merci pour votre aide.

  2. #2
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Le code complet serait mieux car là juste deux lignes.... hum
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  3. #3
    Membre Expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Par défaut
    Avant de tokeniser, tu devrais regarder si la ligne est vide ou non (elle ne contient que '\0' ou que '\n')...
    Si elle est effectivement totalement vide, alors tu ne fais pas les opération suivantes, tu re-fget immédiatement.

    Ou alors : si tu dois ignorer toutes les lignes remplies d'espaces, si tu vois que tu vas insérer une ligne pleine de '0', tu ne l'insères pas !
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  4. #4
    Membre averti
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2011
    Messages : 14
    Par défaut salut voici mon 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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
     
    #define CMAX                400
    #define LMAX                400
    #define MAX_CHAR_PER_LINE    1650
    #define SEP                    " "
    #define PATH                "fichier.txt"
     
     
     
    int main(int argc, char* argv[])
    {
        FILE*    m_File;
        int        i = 0;
        int        j;
        int        Tab[LMAX][CMAX];
        char    szbuff[MAX_CHAR_PER_LINE];
        char*    token = NULL;
     
        m_File = fopen(PATH,"rt");
     
        if(!m_File) return 1;
     
        while(!feof(m_File) && i < LMAX)
        {
                   j = 0;
     
            // On récupere la ligne courante du fichier
            fgets(szbuff,MAX_CHAR_PER_LINE,m_File);
     
            // On decoupe la ligne selon le charactere de séparation  EP (" ")
            token = strtok(szbuff,SEP);
     
                   while(token != NULL && j < CMAX)
            {
                // On stocke la valeur lue dans le tableau
                Tab[i][j] = atoi(token);
                // On lit l'element suivant retourner par strtok
                token = strtok(NULL,SEP);
                // On incremente le compteur des ordonnées
                j++;
            }
     
     
            // On incrémente le compteur des abscisses
            i++;
        }
     
    //affichage
     
        int x;
        for(x=0;x<i;x++)
        {
            int y;
            for( y=0;y<j;y++)
            {
                printf("%i\t",Tab[x][y]);
            }
            printf("\n");
        }
    }//fin main

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2011
    Messages : 14
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    while(!feof(m_File) && i < LMAX){  
     
       fgets(szbuff,sizeof szbuff,m_File);
            token = strtok(szbuff,SEP); 
            length = strlen(szbuff);
    if(length != 0){
     
             printf("\n La longueur de cette ligne est de %u caractere",length);
     
     // la boucle while du token
       }else{
         break;
       }
    j ai pensé faire comme ça, sa ne marche pas, alors que sa a l air bon non?

    autre question je suis revenu à mon code initial, il me donne toujours la meme chose que quand j avais le length, pk

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 833
    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 833
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par adriano12 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    while(!feof(m_File) && i < LMAX){
     
       fgets(szbuff,sizeof szbuff,m_File);
            token = strtok(szbuff,SEP); 
            length = strlen(szbuff);
    j ai pensé faire comme ça, sa ne marche pas, alors que sa a l air bon non?
    Bonjour
    Ce n'est absolument pas bon. feof() ne sert absolument pas à détecter la fin de fichier mais à indiquer, une fois que le fichier n'est plus lu, si l'interruption est due à une fin de fichier ou autre (une erreur).

    Pour lire et détecter une fin de fichier il faut passer par la fonction de lecture elle-même et tester son retour. Typiquement, ici ce serait
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while (fgets(szbuff,sizeof szbuff,m_File) != NULL)
    {
        // Traitement de szbuff
    }
    Ensuite éviter de trop se focaliser sur strtok() qui pose des soucis en cas de réentrance (par exemple un strtok() dans un strtok()) et la remplacer par strtok_r(). Ce n'est pas grave ici mais mieux vaut prendre de suite les bonnes habitudes.
    Et essayer de mettre des noms de variables appropriés (pour moi, szbuff représenterait la taille (size) d'un buffer et non le buffer lui-même).

    Pour le reste les conseils de Metalman sont bons. Si ta ligne est vide alors tu la sautes et tu passes à la suivante...
    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]

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

Discussions similaires

  1. Réponses: 33
    Dernier message: 15/10/2004, 16h19
  2. [XSLT] Probleme de fichier passé en URL
    Par jean.lamy dans le forum Format d'échange (XML, JSON...)
    Réponses: 4
    Dernier message: 07/05/2004, 17h48
  3. [LG]probleme lecture fichier
    Par yp036871 dans le forum Langage
    Réponses: 2
    Dernier message: 28/01/2004, 19h22
  4. [LG]Probleme lecture fichier file of ....
    Par John_win dans le forum Langage
    Réponses: 11
    Dernier message: 11/11/2003, 18h53
  5. [LG]Problème de fichier
    Par Andy_24DB dans le forum Langage
    Réponses: 11
    Dernier message: 03/11/2003, 19h07

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