Probleme fopen (C)

Résolu
Bonjour, je n'arrive pas à ouvrir un fichier avecfopen.
je suis le tuto C du site du zero (https://openclassrooms.com/fr/courses/19980-apprenez-a-programmer-en-c/16421-lire-et-ecrire-dans-des-fichiers
Mon fichier tests.txt est dans le dossier Degug ou se trouve mon prog (tests.txt) .
J'ai Visual Basic C++ express edition
Merci de vos reponses
Configuration: Windows XP
Internet Explorer 7.0
Visual Basic C++ express edition

18 réponses

Résumé de la discussion

Le sujet porte sur des difficultés à ouvrir un fichier avec fopen en C sous Windows, tests.txt ne se trouvant pas nécessairement dans le répertoire de l'exécutable et provoquant un échec d'ouverture. Plusieurs réponses recommandent d'utiliser un chemin absolu, ou vérifier le répertoire de travail de l'application et de placer le fichier dans le même répertoire que l'exécutable, afin d'assurer l'accès en lecture. En pratique, la solution inclut aussi de vérifier le mode d'ouverture ('r' vs 'r+' par exemple) et, si nécessaire, de lire le fichier avec des fonctions sécurisées comme fgets pour diagnostiquer l'erreur. D'autres conseils évoquent les droits d'accès et les emplacements, et l'utilisation d'un chemin absolu est souvent recommandée pour éviter les confusions liées au répertoire courant.

Bobot (l’IA à votre service)
  1. le code a l'air correct...
    tu es sur que le fichier texte est dans le meme repertoire que l'executable ?
    tu peux essayer en passant le chemin complet
    fichier = fopen("C:\\chemin\\test.txt", "r");
    1
    1. ah oui excuse moi j'ai oublié

      mon code:

      tests.h

      je ne sais pas ceque je dois mettre

      main.c

      #include <stdio.h>
      #include <stdlib.h>
      #include "test.h"

      int main(int argc, char *argv[])
      {
      FILE* fichier = NULL;

      fichier = fopen("test.txt", "r");

      if(fichier != NULL)
      { printf("reussi");
      }
      else
      { printf("echoue");
      }

      system("pause");
      return 0;
      }
      0
      1. Oh si la fonction 'fopen' ne fonctionnait pas correctement... il y a longtemps que cela se saurait! Donc elle fonctionne.
        Si tu n'as pas le résultat escompté, 3 solutions:
        1) le mode d'ouverture choisi n'est pas correct,
        2) tu n'as pas les droits corrects sur le fichier,
        3) le fichier ne se trouve pas au bon endroit (essaye en mettant un chemin absolu).
        Tu aurais pu au moins joindre la ligne en défaut, on aurait peut-être eu une autre idée.
        0
        1. j'ai créé le fichier tests.txt avec le bloc notes donc ça doit pas etre les droits, j'ai essayé r et r+, j'ai essayé avec le chemin absolu ...
          0
          1. Dans le programme je lis test.txt et non tests.txt !!!
            0
        2. oui je sais mais j'ai corrigé dans mon code et ça n'a tjr pas marché
          0
          1. essaye le chemin absolu
            0
        3. le chemin absolu ne marche pas non plus ...
          Par contre j'ai peut etre une piste : mon IDE n'est pas dans progammes files mais dans mon dossier, mes programmes créés ne sont pas dans"objets" ça pourrait etre ça ?
          0
          1. Si tu mets le chemin absolu comme l'a indiqué mype, le fichier doit être trouvé quelque soit l'endroit d'où on lance le programme et quelque soit l'endroit où se trouve le programme.
            0
          2. Par copier-coller, donne la ligne 'fichier = fopen...' avec le chemin absolu.
            0
        4. fichier = fopen("C:\\Documents and Settings\\mon nom\\Bureau\\dossier antoine\\informatique\\programmation\\tests\Debug\\tests.txt", "r");
          0
          1. Contributeur
            slt !

            affiche le code on verra ce sui va pas !
            0
            1. Contributeur
              Ah dsl il y a du avoir une erreur sur la page...
              0
          2. slt
            #include <stdio.h>
            #include <stdlib.h>
            #include "test.h"

            int main(int argc, char *argv[])
            {
            FILE* fichier = NULL;

            fichier = fopen("C:\\Documents and Settings\\mon nom\\Bureau\\dossier antoine\\informatique\\programmation\\tests\Debug\\tests.txt", "r+");

            if(fichier != NULL)
            { printf("reussi");
            }
            else
            { printf("echoue");
            }

            system("pause");
            return 0;
            }

            et ça me fait reussi mais le fichier n'est pas ouvert:!
            0
            1. Contributeur
              Si ça t'affiche réussi, c'est qu'il est ouvert. Ouvert au sens programmation ne signifie pas que notepad ou autre va se lancer, mais que flux pointera bien sur le fichier. Et donc tu es prêt à lire le fichier avec des fgets ou autre.
              Cdlt
              0
          3. Contributeur
            Tout ce temps pour résoudre un non-problème. Comme quoi, il faut toujours être précis dans la description des problèmes.
            juste pour afficher, ajoute cette boucle après reussi :
            char buffer[512];
            while(fichier!=EOF)
            {
            fscanf(fichier,"%s",buffer);
            printf(buffer);
            }
            fclose(fichier);
            ne pas oublier de fermer le fichier à la fin, c'est plus propre.
            0
            1. Contributeur
              Salut,
              printf(buffer);
              Vaut mieux :
              printf("%s",buffer);
              ;)
              0
            2. Contributeur
              @fiddyqu'est ce que ça change ?
              0
            3. Contributeur
              @Char SnipeurCela rend possible la faille String.
              Lorsque tu fais printf(buffer), si buffer contient des %x, tu vas faire afficher le code hexa des données de la pile en la descendant. Et en utilisant %x et %n astucieusement tu vas pouvoir modifier l'adresse de retour et donc pourquoi pas exécuter un shellcode.

              Le printf("%s",buffer); rend impossible cette attaque.
              0
            4. Contributeur
              @fiddyMerci !C'est bon à sovoir
              0
          4. Contributeur
            Si tu veux lire dans un fichier, tu peux aussi utiliser fgets (plus sécurisé) :
            char buffer[512];
            while(fgets(buffer,sizeof buffer,fp)!=NULL)
                    printf("%s",buffer);
            
            fflush(stdout);
            fclose(fichier),fichier=NULL;
            
            0
            1. comme ça ?

              #include <stdio.h>
              #include <stdlib.h>
              #include "test.h"

              char buffer[512];
              int main(int argc, char *argv[])
              {
              FILE* fichier = NULL;

              fichier = fopen("C:\\Documents and Settings\\moi\\Bureau\\dossier antoine\\1nf0rm4t1k\\programmation\\tests\Debug\\tests.txt", "r+");

              if(fichier != NULL)
              { printf("reussi");

              while(fichier!=EOF)
              {
              fscanf(fichier,"%s",buffer);
              printf(buffer);
              }
              fclose(fichier);
              }
              else
              { printf("echoue");
              }

              system("pause");
              return 0;
              }
              0
              1. Contributeur
                Salut,
                Plutôt comme ça :
                #include <stdio.h>
                #include <stdlib.h>
                #include "test.h"
                
                int main(int argc, char *argv[])
                {
                FILE* fichier = fopen("C:\\Documents and Settings\\moi\\Bureau\\dossier antoine\\1nf0rm4t1k\\programmation\\tests\Debug\\tests.txt", "r+");
                if(fichier != NULL)
                { 
                char buffer[512];
                printf("reussi");
                
                while(fgets(buffer,sizeof buffer,fichier)!=NULL)
                {
                printf("%s",buffer);
                }
                fclose(fichier),fichier=NULL;
                }
                else
                {
                printf("echoue");
                }
                
                system("pause");
                return 0;
                }
                
                
                0
                1. ok mais la ça me fait echoueappuyez sur une touche pour continuer ... :(
                  0
                  1. Contributeur
                    Si ça fait échouer c'est que ton pointeur fichier vaut NULL. Donc c'est à cause de fopen.
                    Vérifie bien le chemin.
                    0
                2. non en fait il manquait un antislash! maintenant il y a une nette amelioration : reussiappuyez sur une touche ... :/

                  mais fopen permet d'ouvrir un fichier ? de le voir comme si je l'ouvrais normalement ?
                  0
                  1. Contributeur
                    Non. Fopen te permet juste de d'initialiser le pointeur FILE* pour qu'il pointe sur le fichier. Ainsi tu pourras lire le fichier avec des fgets en passant en paramètre le descripteur.
                    Cela n'a rien avoir avec le fait de double cliquer sur un fichier en mode graphique sur ton OS.
                    0
                3. ah ... merci bcp en fait y'avait pas de probleme ?
                  0
                  1. Contributeur
                    Non, c'est ce que Char Snipeur t'a dit dans son message 17. Et dans mon message 15 je t'avais déjà expliqué le sens d'open en sens programmation.
                    0
                4. merci de vos reponses j'avait rien compris
                  0