Partage
  • Partager sur Facebook
  • Partager sur Twitter

pronlème avec l'ouverture des fichiers

Anonyme
    25 janvier 2020 à 12:32:20

    bonjour , je suis rendu au chapitre sur les fichiers du cours sur le langage c et je n'arrive pas a ouvrir un fichier txt ,je vous remercie d'avance de votre aide, voici mon code :

    #include <stdio.h>
    #include <stdlib.h>
    
    FILE* fopen(const char* nomDuFichier,const char* moddeOuverture);
    int main()
    {
       FILE *fichier=NULL;
       fichier=fopen("test.txt","r+");
    
    
        if(fichier !=NULL){
         printf("gg");
        }
        else{
            printf("erreur");
        }
    }
    

    cela m'affiche toujours ça a l'éxécution : 

    Pourtant le fichier test.txt est bien dans le dossier de mon projet : 

    • Partager sur Facebook
    • Partager sur Twitter
      25 janvier 2020 à 13:19:32

      Mets ton fichier test.txt dans le même dossier que ton exécutable (.exe)
      • Partager sur Facebook
      • Partager sur Twitter
        25 janvier 2020 à 14:10:06

        ... ou bien mets le chemin absolu d'accès à ce fichier.
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          25 janvier 2020 à 14:56:04

          magma : comment faire ? il n'ya pas d'éxécutable dans le dossier de mon projet

          zoup : déja essayé et cela ne marche pas

          • Partager sur Facebook
          • Partager sur Twitter
            25 janvier 2020 à 16:56:40

            Herox Codeur a écrit:

            il n'ya pas d'éxécutable dans le dossier de mon projet

            Donc il faut que tu cherches dans quel dossier est situé l'exécutable. Peut-être dans "bin" ? À toi de le trouver. (Moi je ne sais pas, je n'utilise pas d'IDE.)

            Herox Codeur a écrit:

            zoup : déja essayé et cela ne marche pas

            Du coup il y a deux possibilités : A − zoup dit n'importe quoi ; B − tu t'y es mal pris. Tu as droit au 50/50... ;)

            (Si tu n'as pas réussi avec le chemin absolu, il serait plus constructif que tu montres comment tu t'y es pris. Par exemple si tu es sous Windows il est possible que tu n'aies pas écrit correctement les séparateurs '\', c'est une erreur classique. En montrant comment tu as fait, tu as des chances d'obtenir de l'aide.)

            -
            Edité par robun 25 janvier 2020 à 17:02:24

            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              25 janvier 2020 à 17:22:51

              il étais effectivement dans bin , j'ai donc mis le fichier test.txt dedans avec l'executable et j'ai mis ça comme chemin absolu : C:\\Users\\herox\\Documents\\Langage C\\fichier\\bin\\Debug\\test.txt

              mais a la compilation sa affiche jutse une console noire vide avec "process returned 0"

              donc ni le contenu du fichier texte ni un moyen d'ecrire dedans :(

              • Partager sur Facebook
              • Partager sur Twitter
                25 janvier 2020 à 17:58:09

                Hello,

                Ton code ne demande pas de lire le fichier et d'afficher ce qu'il a lu. Il affiche juste "gg" si le fichier a été ouvert (fichier que tu oublies d'ailleurs de fermer) ou "erreur". En C, il faut tout faire: ce n'est pas parce que tu ouvres un fichier que son contenu s'affiche à l'écran.

                • 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

                  25 janvier 2020 à 18:57:20

                  D'après le chemin du binaire, on est encore sur un IDDE ...
                  À première vue, les '\' sont bien placées dans la chaîne s'y référant (et en double comme il se doit).
                  Ça donne 3 questions:
                  + Où se trouve le fichier test.txt?
                  + Où se trouve le binaire du programme?
                  + Quel est le dossier par défaut de l'IDE
                  On peut ajouter: le programme s'exécute-til?
                  Je pense que le fichier test.txt devrait plutôt se trouver sur le chemin par défaut de l'IDE.
                  C'est tellement plus simple avec 'cmd' ...
                  C'est vrai que d'imprimer 'gg' quand c'est ouvert, c'est plutôt simpliste.
                  Pourquoi ne pas  écrire: Le fichier "test.txt est ouvert".
                  • Partager sur Facebook
                  • Partager sur Twitter

                  Le Tout est souvent plus grand que la somme de ses parties.

                    25 janvier 2020 à 19:10:25

                    edgarjacobs a écrit:

                    Hello,

                    Ton code ne demande pas de lire le fichier et d'afficher ce qu'il a lu. Il affiche juste "gg" si le fichier a été ouvert (fichier que tu oublies d'ailleurs de fermer) ou "erreur". En C, il faut tout faire: ce n'est pas parce que tu ouvres un fichier que son contenu s'affiche à l'écran.


                    Je crois que le but est juste de vérifier si le fichier est bien ouvert. Herox Codeur s'attend donc à ce que le programme affiche "gg". Mais là ça affiche "erreur", preuve que l'ouverture ne s'est pas faite.

                    PierrotLeFou : Herox Codeur a déjà répondu : l'exécutable est dans bin\Debug et il a placé "test.txt" dedans. Si "test.txt" et l'exécutable sont bien tous les deux dans le même répertoire, ça doit marcher !

                    Herox Codeur a écrit:

                    j'ai mis ça comme chemin absolu : C:\\Users\\herox\\Documents\\Langage C\\fichier\\bin\\Debug\\test.txt

                    Ce serait mieux de nous montrer le code qui contient ce chemin absolu. Ça se trouve, tu n'as pas écrit tout à fait ça (faute de frappe ou quelque chose de ce genre − il faut bien qu'il y ait une raison au fait que ça ne marche pas...).

                    -
                    Edité par robun 25 janvier 2020 à 19:12:38

                    • Partager sur Facebook
                    • Partager sur Twitter
                      25 janvier 2020 à 19:26:48

                      D'accord, il a placé son fichier test.txt dans le même dossier que le binaire du programme.
                      Mais comment l'IDE démarre-t-il ce programme? En donnant le chemin absolu du binaire?
                      Et je le répète, quel est le chemin par défaut de l'IDE? C'est là que le programme va chercher ses fichiers.
                      Je ne connais pas de fonction simpple qui donne le dossier courant en C, comme 'pwd' sur Linux.
                      Sur Windows, on peut toujours faire system("cd .") pour le savoir.
                      Maintenant si le programme donne une erreur d'ouverture, ça prouve au moins qu'il s'exécute.

                      -
                      Edité par PierrotLeFou 25 janvier 2020 à 19:30:29

                      • Partager sur Facebook
                      • Partager sur Twitter

                      Le Tout est souvent plus grand que la somme de ses parties.

                      Anonyme
                        25 janvier 2020 à 19:28:42

                        voici le code :
                        #include <stdio.h>
                        #include <stdlib.h>
                        
                        FILE* fopen(const char* nomDuFichier,const char* moddeOuverture);
                        int main()
                        {
                           FILE *fichier=NULL;
                           fichier=fopen("C:\\Users\\herox\\Documents\\Langage C\\fichier\\bin\\Debug\\test.txt","r+");
                        if(fichier !=NULL){
                             printf("gg");
                            }
                            else{
                                printf("erreur");
                            }
                        
                        }
                        
                        • Partager sur Facebook
                        • Partager sur Twitter
                          25 janvier 2020 à 19:55:04

                          Et avec ça tu obtiens bien "erreur" (comme tu l'indiques dans ton premier message), ou bien rien du tout (comme tu l'indiquais il y a une heure) ?

                          Dans l'explorateur, quand tu tapes "C:\Users\herox\Documents\Langage C\fichier\bin\Debug" dans la ligne du haut, ça mène bien à un répertoire qui existe et qui contient "test.txt" et l'exécutable ? Comment l'as-tu contrôle ? (Oui, c'est une question bête, mais je n'ai pas beaucoup d'idées...)

                          Et si tu remplaces les \\ par des /, ça donne quoi ? (Je me demande si je n'ai pas lu quelque part que certaine compilateurs C utilisent les / à la place des \).

                          -
                          Edité par robun 25 janvier 2020 à 19:56:01

                          • Partager sur Facebook
                          • Partager sur Twitter
                            25 janvier 2020 à 23:19:58

                            Salut,

                            Cela fonctionne indifféremment avec \\ ou / pour Windows au moins.

                            Dans un test du programme dans l'environnement code::blocks, le chemin est relatif au dossier contenant le projet.cbp, du moins ça a toujours été le cas chez moi.

                            C'est lors de la création du release et du lancement de celui-ci en stand alone que les chemins sont relatif au projet.exe.

                            Ce que je vois dans le log de ton screen c'est que tu as une erreur d'exécution de ton programme que tu ne peux pas voir à l'exécution puisque ton main ne retourne rien, très certainement lié à une redéfinition de la fonction fopen. Donc commence par virer la ligne 4 : fopen est déjà définie par l'inclusion de stdio.h

                            bonne continuation.

                            • Partager sur Facebook
                            • Partager sur Twitter

                            Bonhomme !! | Jeu de plateforme : Prototype.

                              26 janvier 2020 à 1:18:53

                              Salut,
                              Pour les utilisateurs de Windows, il y a la fontion '_getcwd()' qui nous donne le dossier courant:
                              https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/getcwd-wgetcwd?view=vs-2019
                              • Partager sur Facebook
                              • Partager sur Twitter

                              Le Tout est souvent plus grand que la somme de ses parties.

                                26 janvier 2020 à 1:54:24

                                Re,

                                Le chemin courant de l'exe est également donné en argument dans argv[0] lorsque l'on utilise les arguments du main. Il suffit de retrancher le nom de l'exécutable pour avoir le dossier.

                                int main(int argc, char *argv[])


                                Bonne continuation.

                                • Partager sur Facebook
                                • Partager sur Twitter

                                Bonhomme !! | Jeu de plateforme : Prototype.

                                Anonyme
                                  26 janvier 2020 à 14:11:52

                                  j'ai enlevé le fopen et cela m'affiche bien le gg mais en revanche je ne peut toujours pas ni lire et écrire dans le fichier
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    26 janvier 2020 à 15:11:37

                                    Avec le code que tu nous a fourni, il n'y a aucune chance. Il faut faire des 'fread' ou des 'fgetc' à la rigueur.
                                    Si tu as ajouté autre chose, il faut nous le montrer.
                                    • Partager sur Facebook
                                    • Partager sur Twitter

                                    Le Tout est souvent plus grand que la somme de ses parties.

                                    Anonyme
                                      26 janvier 2020 à 15:34:41

                                      voici mon code , j'ai bien mis le fgetc :

                                      #include <stdio.h>
                                      #include <stdlib.h>
                                      
                                      FILE* fopen(const char* nomDuFichier,const char* moddeOuverture);
                                      int main()
                                      {
                                         FILE *fichier=NULL;
                                         fichier=fgetc("C:\\Users\\herox\\Documents\\Langage C\\fichier\\bin\\Debug\\test.txt","r+");
                                      if(fichier !=NULL){
                                           printf("gg");
                                          }
                                          else{
                                              printf("erreur");
                                          }
                                      
                                      }
                                      



                                      error: too many arguments to function 'fgetc'|

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        26 janvier 2020 à 16:08:04

                                        Non, il faut faire le fgetc APRES avoir ouvert le fichier.
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          26 janvier 2020 à 16:41:29

                                          Tu as laissé la ligne 4 malgré la remarque de drx. Pense à rectifier...

                                          Pour lire et écrire dans un fichier, une façon de voir les choses est d'utiliser 'printf' et 'scanf' comme on le fait en console, mais avec leurs versions pour fichier : 'fprintf' et 'fscanf'.

                                          Exemple :

                                          fichier=fopen("C:\\Users\\herox\\Documents\\Langage C\\fichier\\bin\\Debug\\test.txt","r+");
                                          // Maintenant que le fichier est ouvert en lecture, on peut le lire avec 'scanf'
                                          // Supposons que ce fichier contienne deux nombres entiers à la suite
                                          int n1, n2 ;
                                          fscanf(fichier, "%d %d", &n1, &n2) ; // en console on aurait écrit : scanf("%d %d", &n1, &n2) ;
                                          
                                          

                                          Et c'est pareil avec un fichier ouvert en écriture : on utilise 'fprtinf' qui est identique à 'printf' à part qu'il faut indiquer 'fichier' en premier argument.

                                          -
                                          Edité par robun 26 janvier 2020 à 16:45:19

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            26 janvier 2020 à 17:30:51

                                            On peut voir les choses d'une autre façon.
                                            Quand tu entres chez toi, tu débarres la porte (fopen), tu enlèves tes bottes et tu te promènes (fread ou fgetc).
                                            Oups! j'ai oublié de fermer la porte (fclose) pour éviter les courants d'air sur mon disque ...
                                            Le fopen à la ligne 4 n'exécute rien, c'est une déclaration qui semble nuisible ici.
                                            la fonction 'fgetc' n'accepte qu'un argument de type 'FILE *', pas une chaîne de caractères.
                                            • Partager sur Facebook
                                            • Partager sur Twitter

                                            Le Tout est souvent plus grand que la somme de ses parties.

                                            Anonyme
                                              26 janvier 2020 à 19:30:10

                                              robun , le code que tu m'a donné je l'ai mis et j'ai bien viré la ligne 4 mais je n'obitens pas l'affichage du fichier mais juste une console noire avec rien d'ecrit puis process returned (une adresse memoire genre 0x36262828281)

                                              mais cela ne m'affiche pas le cotenu du fichier test.txt (que j'avais au préalablement remplis de seulement 2 chiffre)

                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                27 janvier 2020 à 2:16:26

                                                Ce que robun t'a donné est un exemple. Il faut lire tout le fichier dans une boucle avec 'fscanf' et l'afficher à l'écran avec 'printf'.
                                                Voici un lien qui décrit l'usage de 'fscanf':
                                                http://public.iutenligne.net/informatique/algorithme-et-programmation/priou/LangageC/1742_lecture_dans_un_fichier_texte_par_fscanf_dconseill.html
                                                Tu peux également utiliser 'fgetc' qui lit un caractère à la fois, tu devras encore tester la fin du fichier.
                                                Tu devrais en trouver une description sur ce même site.
                                                Quand on a de gros fichiers qui ne sont pas nécessairement en texte, je préfère 'fread' ou 'read' (philosophie différente).
                                                Ton message "process returned " est-il normal pour code::blocks? As-tu toujours ce message? Sinon, tu as une erreur quelque part.
                                                On n'a pas ce bout de code où tu as mis 'fscanf'. As-tu fait un 'fprintf' sur ce même fichier?
                                                • Partager sur Facebook
                                                • Partager sur Twitter

                                                Le Tout est souvent plus grand que la somme de ses parties.

                                                Anonyme
                                                  31 janvier 2020 à 0:49:09

                                                  oui c'est un message normal affiché a chaque execcution mais d'abitude sa affiche 0 et non une adresse memoire

                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    31 janvier 2020 à 1:08:13

                                                    As-tu mis un '&' devant ta variable dans le 'scanf'? Sinon, tu essaies d'écrire à un endroit protégé, donc invalide.
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter

                                                    Le Tout est souvent plus grand que la somme de ses parties.

                                                      31 janvier 2020 à 13:11:44

                                                      L'idéal serait d'avoir sous les yeux le code source en question.
                                                      • Partager sur Facebook
                                                      • Partager sur Twitter

                                                      pronlème avec l'ouverture des fichiers

                                                      × 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