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 :

Problème de lecture ?!


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de _SamSoft_
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    798
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 798
    Par défaut Problème de lecture ?!
    Bonjour, j'ai un petit problème. Je cherche un moyen de vérifier ce que j'ai lu dans un fichier :

    Voilà un code (concentré de 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
     
    /* ... */
    char commands[256] = "";
     
    for(j = 0 ; j < nbr_of_lines ; j++)
    {
         fgets(commands, sizeof commands, myFile)
         fclean(commands, stdin);
     
         if(strcmp(commands, "") == 0)
        {
           action = NOTHING;
        }
        fprintf(stdout, "Commande : %d\n", action);
    }
    /* ... */
    Le problème est que rien, absolument rien ne s'affiche.

    Merci d'avance

  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 _SamSoft_ Voir le message
    Bonjour, j'ai un petit problème. Je cherche un moyen de vérifier ce que j'ai lu dans un fichier :
    <...>
    Le problème est que rien, absolument rien ne s'affiche.
    C'est peut être normal. As-tu des lignes vides dans ton fichier ?

  3. #3
    Membre éclairé Avatar de _SamSoft_
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    798
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 798
    Par défaut
    Non mais voilà comment je gère la lecture :

    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
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include "io.h"
    #include "general.h"
     
    int create_world(SDL_Surface* screen)
    {
        FILE *general_file = NULL, *other_file = NULL;
     
        robot *my_robot = NULL;
     
        char name_of_map[256] = "", nbr_of_robots_c[256] = "", path_of_file[256] = "", commands[256] = "";
     
        signed int rslt_of_pause = -1;
     
        int *temp = NULL;
        int world = 1, i = 0, j = 0, nbr_of_robots = 0, end = 0;
     
        strcpy(path_of_file, "Data/fichier_principal.myr");
        general_file = fopen(path_of_file, "r");
     
        if(general_file == NULL)
        {
            return 1;
        }
     
        while(end != EOF)
        {
            if(i == 0) /* Si c'est la premiere ligne */
            {
                fgets(nbr_of_robots_c, sizeof nbr_of_robots_c, general_file);
                fclean(nbr_of_robots_c, stdin);
                nbr_of_robots = strtol(nbr_of_robots_c, NULL, 10);
                if(nbr_of_robots <= 0 || nbr_of_robots > 5)
                {
                    nbr_of_robots = 2;
                    fprintf(stdout, "Le nombre de robots est incorrect, il sera de %d\n", nbr_of_robots);
                }
                else
                {
                    fprintf(stdout, "Le nombre de robots sera de %d\n", nbr_of_robots);
                }
                i++;
            }
            else if(i == 1)
            {
                fgets(name_of_map, sizeof name_of_map, general_file);
                fclean(name_of_map, stdin);
                fprintf(stdout, "La map sera %s\n", name_of_map);
                i = 0;
                end = EOF;
            }
            fflush(stdout);
        }
     
        my_robot = realloc(my_robot, sizeof(robot)*nbr_of_robots);
     
        if(my_robot == NULL)
        {
            return 2;
        }
     
        fprintf(stdout, "Initialision des robots\n");
        for(i = 0 ; i < nbr_of_robots ; i++)
        {
            (my_robot+i)->surface = NULL;
            strcpy((my_robot+i)->name, "");
            (my_robot+i)->commands = NULL;
            (my_robot+i)->position.x = -1;
            (my_robot+i)->position.y = -1;
            (my_robot+i)->type = 0;
            (my_robot+i)->n_commands = 0;
        }
        fprintf(stdout, "Fin de l'initialision des robots\n");
     
        fprintf(stdout, "Stockage des actions des robots\n");
        for(i = 0 ; i < nbr_of_robots ; i++)
        {
            strcpy(path_of_file, "");
            strcpy((my_robot+i)->name, "robot");
            strcat(path_of_file, "Data/");
            sprintf(nbr_of_robots_c, "%d", i);
            strcat((my_robot+i)->name, nbr_of_robots_c);
            strcat(path_of_file, (my_robot+i)->name);
     
            other_file = fopen(path_of_file, "r");
     
            if(other_file == NULL)
            {
                fprintf(stdout, "Le fichier \"%s\" est introuvable\n", path_of_file);
                exit(EXIT_FAILURE);
            }
            else
            {
                (my_robot+i)->n_commands = nbr_of_lines(other_file);
                temp = realloc((my_robot+i)->commands, ((my_robot+i)->n_commands)*sizeof(int));
                if(temp == NULL)
                {
                    fprintf(stderr, "temp == NULL\n");
                    exit(EXIT_FAILURE);
                }
                else
                {
                    (my_robot+i)->commands = temp;
                }
     
                for(j = 0 ; j < (my_robot+i)->n_commands ; j++)
                {
                    fgets(commands, sizeof commands, other_file);
                    fclean(commands, stdin);
     
                    if(strcmp(commands, "") == 0)
                    {
                        (my_robot+i)->commands[j] = NOTHING;
                    }
                    else if(strcmp(commands, "rien") == 0)
                    {
                        (my_robot+i)->commands[j] = NOTHING;
                    }
                    else if(strcmp(commands, "start") == 0)
                    {
                        (my_robot+i)->commands[j] = START;
                    }
                    else if(strcmp(commands, "stop") == 0)
                    {
                        (my_robot+i)->commands[j] = STOP;
                    }
     
                    fprintf(stdout, "Commands %d - %d\n", j, (my_robot+i)->commands[j]);
                }
                fclose(other_file);
            }
            fflush(stdout);
        }
        fprintf(stdout, "Fin de stockage des actions des robots\n");
     
        while(world == 1) /* tant que le monde tourne rond */
        {
            rslt_of_pause = my_pause();
     
            if(rslt_of_pause == 0)
            {
                world = 0;
            }
        }
     
        free(my_robot);
     
        return EXIT_SUCCESS;
    }
    Je vous donne tout le code car je ne sais pas vraiment si je peux prendre qu'une partie car il faut voir tout (déclaration...)

    Voilà un fichier type :

    start
    rien
    stop
    Effectivement, la dernière ligne est vide. (Un peu comme à la fin d'un code source en C)

    EDIT: En supprimant la dernière ligne (vide) ca ne fonctionne toujours pas.

    Merci d'avance

  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 _SamSoft_ Voir le message
    Non
    Bah, si il n'y a pas de ligne vide, pourquoi peux tu que ton code indique qu'il y en ait ? C'est pas très logique tout ça...

    Avec ceci :
    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
     
    /* http://delahaye.emmanuel.free.fr/clib/ */
    #include "ed/inc/fclean.h"
     
    int main (void)
    {
    #define F "data.txt"
     
       FILE *fp = fopen (F, "r");
       if (fp != NULL)
       {
          char line[32];
     
          while (fgets(line, sizeof line, fp) !=NULL)
          {
             fclean(line, fp);
     
             printf ("'%s'\n", line);
          }
       }
       else
       {
          perror (F);
       }
       return 0;
    }
    on obtient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    'start'
    'rien'
    'stop'
     
    Press ENTER to continue.
    donc pas de ligne vide.

    L'interpréteur de commande simplifié est donc bien :
    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
     
    /* http://delahaye.emmanuel.free.fr/clib/ */
    #include "ed/inc/prt.h"
    #include "ed/inc/fclean.h"
     
    enum command
    { NOTHING, START, STOP };
     
    int main (void)
    {
    #define F "data.txt"
     
       FILE *fp = fopen (F, "r");
       if (fp != NULL)
       {
          char line[32];
     
          while (fgets (line, sizeof line, fp) != NULL)
          {
             enum command command = NOTHING;
             fclean (line, fp);
     
             if (strcmp (line, "") == 0)
             {
                command = NOTHING;
             }
             else if (strcmp (line, "rien") == 0)
             {
                command = NOTHING;
             }
             else if (strcmp (line, "start") == 0)
             {
                command = START;
             }
             else if (strcmp (line, "stop") == 0)
             {
                command = STOP;
             }
             PRT_I (command);
     
          }
       }
       else
       {
          perror (F);
       }
       return 0;
    }
    ce qui donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    command      = 1
    command      = 0
    command      = 2
     
    Press ENTER to continue.

  5. #5
    Membre éclairé Avatar de _SamSoft_
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    798
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 798
    Par défaut
    Car le fichier est fabriqué par l'utilisateur (il tape tout) donc s'il met une ligne vide, je veux pas que mon programme laisse passer cela.

    Merci d'avance pour votre analyse

  6. #6
    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 _SamSoft_ Voir le message
    Car le fichier est fabriqué par l'utilisateur (il tape tout) donc s'il met une ligne vide, je veux pas que mon programme laisse passer cela.
    Dans ce cas, il faut en mettre dans le fichier de tests. Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    start
     
    rien
    stop

  7. #7
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Citation Envoyé par _SamSoft_ Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    /* ... */
     
         fgets(commands, sizeof commands, myFile)
         fclean(commands, stdin);
     
    /* ... */
    Pourquoi appelles-tu fgets() sur le flux myFile et fclean() sur stdin?

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  8. #8
    Membre éclairé Avatar de _SamSoft_
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    798
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 798
    Par défaut
    Car je lis le contenu d'un fichier or il se peut qu'il est :

    truc
    truc2

    donc commands = "truc\n" or je veux juste "truc" donc fclean(commands, stdin); Ah mais non, personne n'a rien entré -_- Je teste en mettant fclean(commands, myFile);

  9. #9
    Membre éclairé Avatar de _SamSoft_
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    798
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 798
    Par défaut
    C'est bon ca marche. J'ai l'air tout bête -_-

    Merci à vous

    Je viens de me souvenir que le problème c'était pas tant ca (j'ai l'air deux fois plus bête). En fait, je ne sais pas si je peux faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if(strcmp(commands, "truc")
    {
    /* ... */
    }
    Sur un char commands[256]; Sachant que le prototype demande un char *truc;
    Or j'ai besoin d'un char commands[256]; Pour fgets -_-

    Merci d'avance

  10. #10
    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 _SamSoft_ Voir le message
    Je viens de me souvenir que le problème c'était pas tant ca (j'ai l'air deux fois plus bête). En fait, je ne sais pas si je peux faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if(strcmp(commands, "truc")
    {
    /* ... */
    }
    Sur un char commands[256]; Sachant que le prototype demande un char *truc;
    Le nom d'un tableau est équivalent à un pointeur sur son premier élément. Donc si t'as un char commands[256] et que tu passes "commands" à la fonction "strcmp()", celle-ci recevra un char* et le stockera dans une variable locale pour s'en servir...

    Citation Envoyé par _SamSoft_ Voir le message
    Or j'ai besoin d'un char commands[256]; Pour fgets -_-
    T'as pas remarqué que le prototype de fgets() c'est aussi avec un char * ? Pourtant là ça ne t'a pas géné...
    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]

  11. #11
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Le nom d'un tableau est équivalent à un pointeur sur son premier élément.
    C'est le genre d'équivalences que je n'aime pas beaucoup, car elles induisent plus de confusion qu'autre chose. Le nom d'un tableau n'est pas équivalent à un pointeur sur son premier élément. La différence fondamentale est le type. Par exemple, sizeof nom_du_tableau_de_chars n'est pas égal à sizeof (char *). Pour être précis, le nom d'un tableau est implicitement converti en un pointeur sur son premier élément lorsqu'il est utilisé dans une expression (sauf avec l'opérateur sizeof).

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  12. #12
    Membre éclairé Avatar de _SamSoft_
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    798
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 798
    Par défaut
    Vous avez raison sur le second truc. Cela ne m'a pas posé de problèmes car beaucoup de programmeurs le faisait. Je ne savait pas que ca fonctionnait comme ca. Merci

    Mais comment résoure ce problème ?

    PS: J'ai fait cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
                    fgets(commands, sizeof commands, other_file);
                    fprintf(stdout, "commandes: %s\n", commands);
                    fclean(commands, other_file);
                    fprintf(stdout, "commands: %s\n", commands);
    Dans la boucle for(j...) et il n'affiche rien c'est étrange car le fichier est bon (other_file != NULL), il contient bien du texte et aucune ligne vide.

    Merci d'avance

    EDIT: Je n'avais pas vu la solution d'Emmanuel, je vais voir ca désolé.

  13. #13
    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 Thierry Chappuis Voir le message
    Pourquoi appelles-tu fgets() sur le flux myFile et fclean() sur stdin?
    Enaurme !

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

Discussions similaires

  1. [débutant] problème de lecture d'image
    Par shura dans le forum OpenGL
    Réponses: 16
    Dernier message: 03/07/2004, 18h05
  2. [TFileStream] Problème de lecture de string
    Par Pedro dans le forum Langage
    Réponses: 6
    Dernier message: 28/06/2004, 13h06
  3. problème de lecture base de registre
    Par pafounet3 dans le forum MFC
    Réponses: 10
    Dernier message: 31/12/2003, 14h06
  4. [fread] Problème de lecture de buffer
    Par karl3i dans le forum C
    Réponses: 2
    Dernier message: 25/09/2003, 09h21
  5. Réponses: 4
    Dernier message: 23/07/2003, 13h07

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