Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème ouverture de fichier

    14 août 2019 à 12:19:42

    Bonjour, je suis débutant en language C, je n'arrive pas à ouvrir un fichier. Depuis 3h, je suis bloqué et je cherche sur les forums mais je ne trouve pas la solutions (je n'ai peut être pas bien cherché en même temps). Voici mon code : 

    int main(int argc, char *argv[])
    {
        FILE *fichier = NULL, *fichier1=NULL, *fichier2=NULL;
        fichier = fopen("test.txt", "r+");
        if (fichier != NULL)
        {
            printf("Fichier ouvert!");
            fclose(fichier);
        }
        else 
        {
            printf("ERROR\n");
        }

    Et le résultat est toujours : ERROR

    Merci pour ceux qui pourront me répondre

    -
    Edité par SL13 14 août 2019 à 12:21:52

    • Partager sur Facebook
    • Partager sur Twitter
      14 août 2019 à 12:39:39

      Ton code fonctionne, ce qui voudrait dire qu'il ne trouve peut-être pas le fichier.

      Cause possible, il n'existe pas ou il n'est peut-être pas dans le bon dossier.

      Si tu exécutes ton programme depuis un EDI, comme c'est un chemin relatif, il doit se trouver dans le répertoire courant. 

      PS : Utilises le bouton code </> du forum pour poster ton code.

      -
      Edité par rouloude 14 août 2019 à 12:40:40

      • Partager sur Facebook
      • Partager sur Twitter
        14 août 2019 à 13:00:55

        Pour vérifier l'hypothèse comme quoi le fichier n'est pas dans le bon dossier, tu peux remplacer "test.txt" par son chemin complet (chemin absolu).
        • Partager sur Facebook
        • Partager sur Twitter
          14 août 2019 à 14:24:02

          int main(int argc, char *argv[])
          {
              FILE *fichier = NULL, *fichier1=NULL, *fichier2=NULL;
              fichier = fopen("C:\\Utilisateurs\\basti\\Bureau\\programmation\\programme\\ouvrir fermer fichier\\test.txt", "r+");
              if (fichier != NULL)   
              {
                  printf("Fichier ouvert!");
                  fclose(fichier);
              }
              else
              {
                  printf("ERROR\n");
              }
          Merci pour la réponse et pour l'info mais le code (ci-dessus) ne fonctionne toujours pas. Pour info (au cas où), j'utilise Code::Blocks. De plus, normalement, je crée un fichier qui devrait se trouver dans le dossier de l'exécutable mais il n'y a rien. J'ai recherché dans tout le pc un fichier du nom "test", "test.txt", "fichier", etc... et rien.

          -
          Edité par SL13 14 août 2019 à 14:31:53

          • Partager sur Facebook
          • Partager sur Twitter
            14 août 2019 à 14:40:45

            La fonction  fopen renseigne la variable errno, ce qui permet de connaître plus précisément la raison de l'échec.

            Voir perror().

            -
            Edité par michelbillaud 14 août 2019 à 14:41:06

            • Partager sur Facebook
            • Partager sur Twitter
              14 août 2019 à 15:25:56

              D'accord, voici le nouveau code :

              int main(int argc, char *argv[])
              {
                  FILE *fichier = NULL, *fichier1=NULL, *fichier2=NULL;
                  fichier = fopen("C:\\Utilisateurs\\basti\\Bureau\\programmation\\programme\\ouvrir fermer fichier\\test.txt", "r+");/*J'ouvre le fichier que je nomme "test.text" avec la posssibilité de lire
                  et d'écrire dans le fichier (r+) avec la fonction fopen*/
                  if (fichier != NULL)
                  {
                      printf("Fichier ouvert!");
                      fclose(fichier);
                  }
                  else 
                  {
                      perror("test.txt");
                  }

              et la réponse : test.txt: No such file or directory

              • Partager sur Facebook
              • Partager sur Twitter
                14 août 2019 à 16:14:42

                Le répertoire des utilisateurs ne s'appelle-t-il pas plutôt "C:\Users" sous Windows ? (Il s'affiche comme "Utilisateurs" dans l'explorateur mais je sais que sous Windows 7 son vrai nom est "Users". Pour les Windows suivants je ne sais pas. Et puis ça se trouve ça marche avec les deux noms, là je propose ça juste comme une piste, au cas où.)

                -
                Edité par robun 14 août 2019 à 16:17:58

                • Partager sur Facebook
                • Partager sur Twitter
                  14 août 2019 à 16:33:12

                  SL13 a écrit:

                  J'ai recherché dans tout le pc un fichier du nom "test", "test.txt", "fichier", etc... et rien.

                  C'est pas la peine de chercher, tu ne le trouveras pas.

                  Pour ouvrir un un fichier avec le mode "r", le fichier doit exister ! 

                  Aussi avec une exécution depuis Code::Blocks le répertoire courant n'est pas forcément celui de l’exécutable, mais celui mentionné dans les propriété du Projet. 

                  • Partager sur Facebook
                  • Partager sur Twitter
                    14 août 2019 à 20:42:23

                    Ok daco. Et, cela peut paraître super simple pour vous mais où trouve-t-on les propriétés du projet?
                    • Partager sur Facebook
                    • Partager sur Twitter
                      14 août 2019 à 20:53:20

                      Menu -> Project -> Properties...
                      • Partager sur Facebook
                      • Partager sur Twitter
                        14 août 2019 à 23:18:58

                        int main(int argc, char *argv[])
                        {
                            FILE *fichier = NULL, *fichier1=NULL, *fichier2=NULL;
                            fichier = fopen("C:\\Users\\basti\\Desktop\\programmation\\programme\\ouvrir fermer fichier\\test.txt", "r+");
                            if (fichier != NULL)
                            {
                                printf("Fichier ouvert!");
                                fclose(fichier);
                            }
                            else
                            {
                                perror("test.txt");
                            }
                        J'ai modifié le code et la réponse est toujours "test.txt: No such file or directory".
                        • Partager sur Facebook
                        • Partager sur Twitter
                          14 août 2019 à 23:36:22

                          Prends le problème autrement : fais un programme qui _écrit_ dans un fichier "essai.txt". Tu verras bien où il arrive.

                          PS: les noms de fichiers et de dossiers avec des espaces et des caractères bizarres, c'est toujours le boxon sous windows. Et avec des noms à rallonge, il y a 3 chances sur 2 qu'il y ait une faute de frappe.

                          Pour faire des tests, un répertoire C:\\Windows\\TEMP, c'est bien aussi. Astuce : on peut utiliser des / au lieu de \\, soit  "C:/Windows/TEMP". 

                          Pour la petite histoire, Bill Gates aurait bien voulu avoir des / dans les chemins d'accès comme sous Unix dont il était un fan, mais le / était déjà pris pour noter les options des commandes MS-DOS, un truc pompé sur CP/M.

                          -
                          Edité par michelbillaud 14 août 2019 à 23:38:45

                          • Partager sur Facebook
                          • Partager sur Twitter
                            15 août 2019 à 0:42:09

                            Il existe ou pas ton fichier ?
                            • Partager sur Facebook
                            • Partager sur Twitter
                              15 août 2019 à 6:40:22

                              SL13 a écrit:

                              J'ai modifié le code et la réponse est toujours "test.txt: No such file or directory".

                              Comment as-tu vérifié que ce fichier existe ? (C'est juste pour être sûr de ne pas être lancé sur une fausse piste.)

                              (Oups, c'est la même question que rouloude. Comme ça elle ne passera pas inaperçue...)

                              -
                              Edité par robun 15 août 2019 à 6:41:01

                              • Partager sur Facebook
                              • Partager sur Twitter
                                15 août 2019 à 11:11:38

                                Désolé pour l'attente, je vérifie si le fichier existe en regardant dans le fichier de l'exécutable et avec la réponse que je reçoit sur la boîte noir avec le vérificateur d'ouverture.

                                J'ai modifié le code:

                                int main(int argc, char *argv[])
                                {
                                    FILE *fichier = NULL, *fichier1=NULL, *fichier2=NULL;
                                    fichier = fopen("C:/TEMP/essai.txt", "r+");
                                    if (fichier != NULL)
                                    {
                                        printf("Fichier ouvert!");
                                        fclose(fichier);
                                    }
                                    else
                                    {
                                        perror("test.txt");
                                    }
                                Et il m'écris la même réponse. Je suis allé voir dans le fichier (qui a été modifié à l'heure de la compilation) et il n'y a pas le fichier "essai.txt"
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  15 août 2019 à 11:21:21

                                  rouloude a écrit:

                                  Il existe ou pas ton fichier ?

                                  Je ne te demandais pas de vérifier si existait mais si il existe !?!

                                  Il faut lire les réponses que l'on t'apporte, sinon ce n'est pas la peine de venir poser des questions sur le forum !

                                  Donc au vu des indication que tu apportes, je suppose qu'il n'existe pas.

                                  Donc comme je te l'ai dit plus haut et que tu 'as pas lu, ce n'est pas la peine d'aller le chercher, tu ne le trouvera pas ! (le mode "r" de fopen échoue si le fichier n'existe pas !)



                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    15 août 2019 à 11:27:06

                                    Ah OK donc en fait tout va bien, le programme marche parfaitement ! Il signale que le fichier n'existe pas parce que le fichier n'existe pas.

                                    En effet l'hypothèse avait été signalée par rouloude dès son premier message.

                                    (Pour vérifier qu'un fichier existe, on va dans l'explorateur, dans le répertoire concerné, et on regarde s'il est dans la liste des fichiers.)

                                    -
                                    Edité par robun 15 août 2019 à 11:27:50

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      15 août 2019 à 11:35:46

                                      Avec une persévérance toute agricole, tu zappes toujours la même partie dans nos explications : il faut que le fichier existe avant, ca ne va pas le créer.

                                      • fopen(...., "r+"),  ça sert à ouvrir un fichier existant
                                      • et si le fichier n'existe pas préalablement, ça fait couiner avec "No such file or directory", forcément.
                                      • C'est écrit dans la doc
                                        The argument mode points to a string beginning with one of the  follow‐
                                        ing sequences (possibly followed by additional characters, as described
                                        below):
                                      
                                             r      Open text file for reading.  The stream is positioned at the be‐
                                                    ginning of the file.
                                      
                                             r+     Open  for  reading and writing.  The stream is positioned at the
                                                    beginning of the file.
                                      
                                             w      Truncate file to zero length or create text  file  for  writing.
                                                    The stream is positioned at the beginning of the file.
                                      
                                             w+     Open  for  reading  and writing.  The file is created if it does
                                                    not exist, otherwise it is truncated.  The stream is  positioned
                                                    at the beginning of the file.
                                      
                                             a      Open  for  appending (writing at end of file).  The file is cre‐
                                                    ated if it does not exist.  The stream is positioned at the  end
                                                    of the file.
                                      
                                             a+     Open  for  reading  and appending (writing at end of file).  The
                                                    file is created if it does not exist.  The initial file position
                                                    for  reading  is at the beginning of the file, but output is al‐
                                                    ways appended to the end of the file.
                                      
                                      

                                      Si tu veux que ça crée le fichier dans le cas où il n'existe pas, c'est le mode  a+ ou r+(edit) w+ si tu veux à la fois lire et écrire, selon ce que tu veux exactement

                                      #include <stdio.h>
                                      
                                      const char *mode =
                                      //  "r+";  // lecture et écriture au début d'un fichier existant
                                          "a+";  // création éventuelle, lecture au début/écriture à la fin
                                      //  "w+";  // création éventuelle, lecture et écriture au début
                                      
                                      
                                      int main()
                                      {
                                          FILE *fichier = fopen("test.txt", mode);
                                          if (fichier != NULL) {
                                              printf("Fichier ouvert!");
                                              fclose(fichier);
                                          } else {
                                              perror("Ouverture fichier");
                                          }
                                      }
                                      




                                      -
                                      Edité par michelbillaud 15 août 2019 à 14:41:05

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        15 août 2019 à 14:37:17

                                        Ouups

                                        michelbillaud a écrit:

                                        Si tu veux que ça crée le fichier dans le cas où il n'existe pas, c'est le mode  a+ ou r+ 

                                        w+ (petite distraction)

                                        -
                                        Edité par edgarjacobs 15 août 2019 à 14:37:40

                                        • Partager sur Facebook
                                        • Partager sur Twitter

                                        On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

                                          15 août 2019 à 14:39:40

                                          Excusez-moi, je ne suis pas très attentif et merci beaucoup, ça fonctionne. Mais j'ai une autre question : Comment peut-on créer un fichier? Je pensais que c'était en créant la variable pointeur "fichier" de type FILE, donc, y-a-t-il un autre moyen de le créer au lieu de mettre le mode a+ dans le fopen?

                                          Merci pour vos réponses précises et rapides et de m'avoir aider pour ce problème.

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            15 août 2019 à 14:41:31

                                            Corrigé, merci !

                                            Pour créer un fichier : avec fopen ou creat qui est un synonyme du bon vieux temps où les noms de fonction avaient 5 lettres au plus. Pourquoi tu ne veux pas l'utiliser, alors que ça fait le boulot, et correctement ?

                                            On peut créer avec le mode w+ aussi. Bon, il y a open aussi. 

                                            Ces cours de daube utilisent à tort et à travers le mot créer, que c'en est une calamité.

                                            Tu ne crée pas une variable, tu la déclares. Et déclarer une variable, ça ne fabrique pas un nouveau fichier sur ton disque dur. Pour ça, il faut appeler une fonction de bibliothèque qui demande au système de le faire.

                                            -
                                            Edité par michelbillaud 15 août 2019 à 14:54:28

                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              15 août 2019 à 14:47:31

                                              Merci beaucoup à tous, je vais pouvoir continuer!
                                              • Partager sur Facebook
                                              • Partager sur Twitter

                                              Problème ouverture de fichier

                                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                              • Editeur
                                              • Markdown