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 :

[Manipulation de fichier] Tester l'existence d'un fichier.


Sujet :

C

  1. #1
    Membre à l'essai
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mars 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Mars 2011
    Messages : 16
    Points : 20
    Points
    20
    Par défaut [Manipulation de fichier] Tester l'existence d'un fichier.
    Bonjour,

    Je réalise un programme en mode console qui me permettra d'ouvrir et donc de lire un fichier, de créer un fichier dont on aura le choix de l'extension, et d'écrire dans un fichier. Seulement j'ai un petit problème, dont 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
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    #include <stdio.h>
    #include <stdlib.h>
    #define TAILLE_MAX 1000
     
    char nf[80];
    FILE* fichier = NULL;
     
    void readFile(char nf[80]);
    void writeFile(char nf[80]);
     
    int main(){
       int choix = 0;
       printf("   MENU   \n");
       printf("1. Lire un fichier\n");
       printf("2. Creer un fichier\n");
       printf("3. Ecrire dans un fichier\n");
     
       printf("Votre choix ?");
       scanf("%d", &choix);
     
        if (choix == 1) {
            printf("Nom du fichier a lire :");
            fflush(stdin);
            fgets(nf, 80, stdin); }
     
        else if(choix == 2) {
            printf("Nom du fichier a creer :");
            fflush(stdin);
            fgets(nf, 80, stdin);
        }
        else if(choix == 3) {
            printf("Nom du fichier a ecrire :");
            fflush(stdin);
            fgets(nf, 80, stdin);
        }
        else {
            printf("Veuillez entrer un nombre valide !\n"); }
     
       printf("\n");
     
       switch(choix) {
           case 1:
                readFile(nf);
                break;
           case 2:
                //createFile(nf);
                break;
           case 3:
                writeFile(nf);
                break;
       }
       return 0;
    }
     
    void readFile(char nf[80]) {
        fichier = fopen(nf, "r");
        int caractereActuel = 0;
     
        if(fichier == NULL) {
            printf("Impossible d'ouvrir le fichier");
            exit(1);
        }
        printf(".............. Ouverture du fichier %s\n", nf);
     
        caractereActuel = fgetc(fichier);
     
        while (caractereActuel != EOF) {
             printf("%c", caractereActuel);
             caractereActuel = fgetc(fichier);
         }
        fclose(fichier);
    }
     
    void writeFile(char nf[80]) {
        char entree[100];
        fichier = fopen(nf, "w");
     
        if(fichier == NULL) {
            printf("Ce fichier n'existe pas, il sera cree.\n");
        }
     
        printf("Que voulez-vous écrire dans ce fichier ?\n");
        fgets(entree, 80, stdin);
     
        fputs(entree, fichier);
        fclose(fichier);
    }
    Le problème c'est que dans les deux fonctions (readFile() et writeFile()), la condition revoie toujours NULL : le fichier n'existe jamais et quand je veux le créer avec le mode w, il ne se créé pas.

    Quelqu'un peut m'expliquer ?

    Merci.

  2. #2
    Membre éclairé
    Avatar de Elijha
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Avril 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2003
    Messages : 314
    Points : 742
    Points
    742
    Par défaut
    Bonsoir,

    Tes fonctions d'écriture/lecture fonctionnent bien. Regarde plutôt du côté de la saisie de ton nom de fichier.
    Nota sur la fonction fgets : Si un retour-chariot (newline) est lu, il est placé dans le buffer.
    - Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !
    - Travailler dur n'a jamais tué personne, mais pourquoi prendre le risque (Edgar Bergen)

  3. #3
    Membre à l'essai
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mars 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Mars 2011
    Messages : 16
    Points : 20
    Points
    20
    Par défaut
    Je ne trouve pas, désolé.
    Un indice ?

  4. #4
    Membre éclairé
    Avatar de Elijha
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Avril 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2003
    Messages : 314
    Points : 742
    Points
    742
    Par défaut
    Bonsoir,

    A la place de scanf, essaye d'utiliser la fonction fgetc.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        choix = fgetc(stdin) ;          // Saisie du caractère
        while(fgetc(stdin)!='\n') ;     // Vidage du buffer clavier
    Attention, choix n'est plus une valeur numérique, mais un caractère. Il te faut tester dans ton switch une liste de caractères.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
         case '1' :
         ...
         case '2' :
         ...
    - Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !
    - Travailler dur n'a jamais tué personne, mais pourquoi prendre le risque (Edgar Bergen)

  5. #5
    Membre à l'essai
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mars 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Mars 2011
    Messages : 16
    Points : 20
    Points
    20
    Par défaut
    Le 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
    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
    #include <stdio.h>
    #include <stdlib.h>
    #define TAILLE_MAX 1000
     
    char nf[80];
    FILE* fichier = NULL;
     
    void readFile(char nf[80]);
    void writeFile(char nf[80]);
     
    int main(){
       int choix = 0;
       printf("   MENU   \n");
       printf("1. Lire un fichier\n");
       printf("2. Creer un fichier\n");
       printf("3. Ecrire dans un fichier\n");
     
       printf("Votre choix ?");
       choix = fgetc(stdin);
       while(fgetc(stdin)!='\n') ;
     
        if (choix == '1') {
            printf("Nom du fichier a lire :\n");
            fflush(stdin);
            fgets(nf, 80, stdin); }
     
        else if(choix == '2') {
            printf("Nom du fichier a creer :\n");
            fflush(stdin);
            fgets(nf, 80, stdin);
        }
        else if(choix == '3') {
            printf("Nom du fichier a ecrire :\n");
            fflush(stdin);
            fgets(nf, 80, stdin);
        }
        else {
            printf("Veuillez entrer un nombre valide !\n"); }
     
       printf("\n");
     
       switch(choix) {
           case '1':
                readFile(nf);
                break;
           case '2':
                //createFile(nf);
                break;
           case '3':
                writeFile(nf);
                break;
       }
       return 0;
    }
     
    void readFile(char nf[80]) {
        fichier = fopen(nf, "r");
        int caractereActuel = 0;
     
        if(fichier == NULL) {
            printf("Impossible d'ouvrir le fichier");
            exit(1);
        }
        printf(".............. Ouverture du fichier %s\n", nf);
     
        caractereActuel = fgetc(fichier);
     
        while (caractereActuel != EOF) {
             printf("%c", caractereActuel);
             caractereActuel = fgetc(fichier);
         }
        fclose(fichier);
    }
     
    void writeFile(char nf[80]) {
        char entree[100];
        fichier = fopen(nf, "w");
     
        if(fichier == NULL) {
            printf("Ce fichier n'existe pas, il sera cree.\n");
        }
     
        printf("Que voulez-vous écrire dans ce fichier ?\n");
        fgets(entree, 80, stdin);
     
        fputs(entree, fichier);
        fclose(fichier);
    }
    Mais ça ne marche pas : ma fonction readFile() me renvoie toujours "Impossible d'ouvrir le fichier", alors qu'il existe bien (répertoire bin\\Debug\\, nommé test.txt).

    Merci.

  6. #6
    Membre éclairé
    Avatar de D[r]eadLock
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    504
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 504
    Points : 750
    Points
    750

  7. #7
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 81
    Points : 128
    Points
    128
    Par défaut
    La réponse a été donné par Elijha :
    Citation Envoyé par Elijha Voir le message
    Nota sur la fonction fgets : Si un retour-chariot (newline) est lu, il est placé dans le buffer.
    Ta variable nf contient la chaine "test.txt\n" et pas "test.txt" comme tu le penses.

  8. #8
    Membre à l'essai
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mars 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Mars 2011
    Messages : 16
    Points : 20
    Points
    20
    Par défaut
    Merci à vous ! Il se fait tard, je regarde tout ça demain, et je fais un suivi.

  9. #9
    Membre à l'essai
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mars 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Mars 2011
    Messages : 16
    Points : 20
    Points
    20
    Par défaut
    Ok, c'est parfait !

    J'ai donc créé une fonction pour remplacer les \n par des \0 :

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define TAILLE_MAX 1000
     
    char nf[80];
    FILE* fichier = NULL;
     
    void readFile(char nf[80]);
    void writeFile(char nf[80]);
    int entree(char *chaine, int longueur);
     
    int main(){
       int choix = 0;
       printf("   MENU   \n");
       printf("1. Lire un fichier\n");
       printf("2. Creer un fichier\n");
       printf("3. Ecrire dans un fichier\n");
     
       printf("Votre choix ?");
       choix = fgetc(stdin);
       while(fgetc(stdin)!='\n') ;
     
        if (choix == '1') {
            printf("Nom du fichier a lire :\n");
            fflush(stdin);
            entree(nf, 80); }
     
        else if(choix == '2') {
            printf("Nom du fichier a creer :\n");
            fflush(stdin);
            entree(nf, 80);
        }
        else if(choix == '3') {
            printf("Nom du fichier a ecrire :\n");
            fflush(stdin);
            entree(nf, 80);
        }
        else {
            printf("Veuillez entrer un nombre valide !\n"); }
     
       printf("\n");
     
       switch(choix) {
           case '1':
                readFile(nf);
                break;
           case '2':
                //createFile(nf);
                break;
           case '3':
                writeFile(nf);
                break;
       }
       return 0;
    }
     
    void readFile(char nf[80]) {
        fichier = fopen(nf, "r");
        int caractereActuel = 0;
     
        if(fichier == NULL) {
            printf("Impossible d'ouvrir le fichier");
            exit(1);
        }
        printf(".............. Ouverture du fichier %s\n", nf);
     
        caractereActuel = fgetc(fichier);
     
        while (caractereActuel != EOF) {
             printf("%c", caractereActuel);
             caractereActuel = fgetc(fichier);
        }
        fclose(fichier);
        getchar();
    }
     
    void writeFile(char nf[80]) {
        char entree[100];
        fichier = fopen(nf, "w");
     
        if(fichier == NULL) {
            printf("Ce fichier n'existe pas, il sera cree.\n");
        }
     
        printf("Que voulez-vous ecrire dans ce fichier ?\n");
        fgets(entree, 80, stdin);
        fputs(entree, fichier);
     
        fclose(fichier);
    }
     
     
    int entree(char *chaine, int longueur)
    {
        char *Entree = NULL;
     
        if (fgets(chaine, longueur, stdin) != NULL){  // Si la saisie se fait sans erreur
            Entree = strchr(chaine, '\n');
            if (Entree != NULL) // Si on a trouvé le retour à la ligne
            {
                *Entree = '\0'; // On remplace ce caractère par \0
            }
            return 1;
        }
        else {
            return 0;
        }
    }
    Merci à vous et désolé pour l'erreur un peu bête !

  10. #10
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Tu devrais éliminer du code tous les fflush(stdin).
    fflush() n'a de comportement défini que pour un flux de sortie, pas pour un flux d'entrée pour lequel le comportement de fflush() diffère selon l'implémentation.
    Des informations complémentaires se trouvent dans la FAQ où il y a aussi des informations sur comment vider un buffer d'entrée.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

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

Discussions similaires

  1. [FTP] Tester l'existence d'un fichier.
    Par antony dans le forum Langage
    Réponses: 2
    Dernier message: 03/03/2006, 18h54
  2. [File]Tester l'existence d'un fichier
    Par florantine dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 23/11/2005, 10h45
  3. tester l existence d un fichier sous turbo pascal
    Par Newllite dans le forum Turbo Pascal
    Réponses: 5
    Dernier message: 25/01/2004, 12h47
  4. Peut on tester l'existence d'un fichier ?
    Par Alamassepointcom dans le forum Flash
    Réponses: 2
    Dernier message: 10/10/2002, 12h10

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