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 :

[débutant] problème avec les arguments de fopen


Sujet :

C++

  1. #1
    Membre régulier
    Femme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2005
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2005
    Messages : 98
    Points : 99
    Points
    99
    Par défaut [débutant] problème avec les arguments de fopen
    Bonjour,

    Je dois réaliser un programme qui envoie un fichier d'un PC à un autre par un protocole particulier. Pour cela, j'ai des fonctions écrites en C que je peux adapter.

    En début de main, je demande divers paramètres nécessaires à ma fonction d'envoi, dont le nom du fichier à envoyer sous forme d'un const char* pour respecter l'argument correspondant de fopen (j'ai bien sûr inclus le fichier en question dans mon répertoire de travail) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	cout << "nom du fichier a envoyer (sans l'extension) "  << endl;
            cin >> &fichier; //stockage dans l'adresse pointée par fichier
    J'appelle ensuite ma fonction d'envoi. La lecture du fichier se fait dans celle-ci par:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    infile = fopen(fichier, "rt");
    Tout ce beau code se compile parfaitement, à l'exception du warning :

    Citation Envoyé par mon IDE
    "[C++ Avertissement] sendrou.cpp(26): W8030 Un temporaire a été utilisé pour le paramètre 'p' dans l'appel à 'istream::operator >>(void * &)'"
    Par contre, au moment de l'exécution, mon PC se bloque sur la ligne ci-dessus, et je reçois le message d'erreur suivant :

    Citation Envoyé par mon PC
    Le projet rou_v_car.exe a provoqué une classe d'exception EAcessViolation avec le message 'Violation d'accès à l'adresse 7C9112B4. Lecture de l'adresse 00000100.' Processus stoppé.
    Quelqu'un peut-il m'aider à résoudre mon problème svp :
    Merci d'avance

  2. #2
    Membre éprouvé Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Points : 1 122
    Points
    1 122
    Par défaut
    Bonjour, un exemple de code avec fopen:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    FILE *FrameFile;
     
    if (!(FrameFile = fopen("Frame.txt","r")))
        return EXIT_FAILURE;
    ...
    fclose(FrameFile);
    Remarque 1: Le premier argument de fopen est un char *, utilises tu des strings C++ ?

    2> fopen renvoie un FILE *, il faut avant de continuer tester que le fichier a été alloué. Car en fonction des droits d'accès et d'un certains nombre de paramètres, le valeur de retour est NULL et le code qui suit provoque une violation de mémoire.

  3. #3
    Membre régulier
    Femme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2005
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2005
    Messages : 98
    Points : 99
    Points
    99
    Par défaut
    Citation Envoyé par Caine

    Remarque 1: Le premier argument de fopen est un char *, utilises tu des strings C++ ?
    1-Le programme original utilisait bien un char*, mais l'aide de mon IDE me disait que le premier argument de fopen était un const char*, d'où ma modification. Quelle est la différence svp?

    2-C'est quoi un "string"?

    Citation Envoyé par Caine
    2> fopen renvoie un FILE *, il faut avant de continuer tester que le fichier a été alloué. Car en fonction des droits d'accès et d'un certains nombre de paramètres, le valeur de retour est NULL et le code qui suit provoque une violation de mémoire.
    C'est prévu dans la suite de ma fonction d'envoi, et je ne le vois pas s'afficher :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if (infile == NULL)
    		{
    		printf("Error: Could not open the file for reading.\n");
                    ...
                     }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    FILE *FrameFile;
     
    if (!(FrameFile = fopen("Frame.txt","r")))
        return EXIT_FAILURE;
    ...
    fclose(FrameFile);
    L'ajout des guillemets aux bornes de mon nom de fichier provoque le même warning à la compilation. A l'exécution, le programme s'exécute normalement jusqu'à ce que j'entre le nom du fichier à envoyer. Ensuite la fenêtre se ferme

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 29
    Points : 30
    Points
    30
    Par défaut
    Salut !
    Si tu veux vraiment faire du C++, utilise <fstream> pour les fichiers, <string> pour les chaines.
    Et pour récuperer le nom de fichier, utilises plutôt getline(cin,nomFichier) pour éviter de louper les noms de fichiers contenant des espaces,etc.

    Par contre pour ce qui est de la communication, je suppose que c'est du code spécifique au système (qui est..?)

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 116
    Points : 68
    Points
    68
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cin >> &fichier; //stockage dans l'adresse pointée par fichier
    Ce serait pas
    plutôt ?

    Ton compilo te mets une erreur à la ligne 26 c'est quoi à la ligne 26


  6. #6
    Membre régulier
    Femme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2005
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2005
    Messages : 98
    Points : 99
    Points
    99
    Par défaut
    Citation Envoyé par TheRedLed
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cin >> &fichier; //stockage dans l'adresse pointée par fichier
    Ce serait pas
    plutôt ?
    En effet Avec cette modification, tout se compile bien sans aucun warning, mais l'exécution plante dès que j'ai entré le nom de mon fichier avec le même message d'erreur que dans mon premier post.

  7. #7
    Membre éprouvé Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Points : 1 122
    Points
    1 122
    Par défaut
    Il nous faut le code après le if (infile == NULL) ...sinon, on ne pourra pas t'aider.

    Question, ce if n'est pas exécuté, tu ne vois pas le message d'erreur s'afficher ?

  8. #8
    Membre régulier
    Femme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2005
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2005
    Messages : 98
    Points : 99
    Points
    99
    Par défaut
    Non, le message n'apparaît pas, donc je suppose qu'il n'est pas exécuté.

    Le code c'est :
    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
    	if (infile == NULL)
    		{
    		printf("Error: Could not open the file for reading.\n");
    		free(packet);
    		return;
    		}
    	bytesread = 1; // initialisation de bytesread
     
    	while ((!feof(infile)) && (bytesread < filesize))
    		{
    		/* Attempt to read in a chunk of bytes */
    		count = fread(packet + bytesread + 2, sizeof(unsigned char),
    		filesize - bytesread, infile);
     
    		if (ferror(infile))
    			{
    			printf("Error: Could not read from file.\n");
    			free(packet);
    			return;
    			}
     
    		bytesread += count;
    		}
     
    	fclose(infile);
    Je pense que ça devrait vous suffire.

  9. #9
    Membre éprouvé Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Points : 1 122
    Points
    1 122
    Par défaut
    Effectivement,

    tu es sûre de cette portion du code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    count = fread(packet + bytesread + 2, sizeof(unsigned char), 
          filesize - bytesread, infile);
    Notamment, que packet est alloué et avec la taille correcte, que l'expression packet + bytesread + 2 reste dans l'espace mémoire du tableau packet ?

    C'est la seule source d'erreur possible dans ce code.

  10. #10
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    eof est toujours mal utilisé, en l'occurence cela ne doit jamais être utilisé comme condition de fin de lecture pour une boucle. Voir la FAQ à ce sujet, ou la FAQ C++ lite si ça n'a pas encore été ajouté (me rappelle plus).

    De toute façon, et comme ça t'a déjà été dit, en C++ on utilise :

    - std::string pour les chaînes
    - std::getline pour saisir des chaînes avec espaces
    - std::*fstream pour les fichiers

    C'est bien plus simple et sécurisé.

  11. #11
    fd
    fd est déconnecté
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 131
    Points : 162
    Points
    162
    Par défaut
    tu la déclare comment ta var fichier ?
    char *fichier ?

  12. #12
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    EDIT : tiens, il n'y a plus la réponse qui disait "oui exactement".


    J'ai l'impression que je vais me répéter, mais bon...

    Si ton code est le suivant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char* fichier;
    cin >> fichier;
    Alors il est normal qu'il plante : il n'y a aucune mémoire allouée pour ta chaîne.

    Si ton code est le suivant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char fichier[256]; // ou char* fichier = new char[256]
    cin >> fichier;
    Alors ça a des chances de fonctionner mais tu imposes une limite inutile à ton programme, qui finira un jour où l'autre par te causer du tord.

    En C++ on utilise std::string pour les chaînes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #include <string>
     
    std::string fichier;
    cin >> fichier;
     
    // Ou bien, si on veut pouvoir saisir des espaces dans le nom de fichier
     
    std::getline(cin, fichier);
    J'espère que tout ça est bien clair maintenant.

  13. #13
    Membre régulier
    Femme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2005
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2005
    Messages : 98
    Points : 99
    Points
    99
    Par défaut
    Citation Envoyé par fd
    tu la déclare comment ta var fichier ?
    char *fichier ?
    Exactement.

    Citation Envoyé par Caine
    Notamment, que packet est alloué et avec la taille correcte, que l'expression packet + bytesread + 2 reste dans l'espace mémoire du tableau packet ?
    Il y a en effet quelque chose que je trouve étrange dans cette ligne : packet est un tableau de char et bytesread un unsigned long. Ca semble quand même bizarre qu'ils aient voulu ajouter des variables de types différents

    Ceci dit, j'ai trouvé un autre moyen de transmettre mes fichiers (qui marche, celui-là), donc la réponse à ce sujet urge moins dorénavant. Mais j'aimerais quand même connaître la solution à mon problème, car je dois utiliser du C ou du C++ pour la suite de mon stage.
    En tout cas merci beaucoup à tous vous êtes vraiment super

  14. #14
    Membre régulier
    Inscrit en
    Décembre 2005
    Messages
    225
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 225
    Points : 113
    Points
    113
    Par défaut La cause de ton erreur
    Salut tous , j'avais moi aussi cette erreur et voici la solution :
    Si tu utilise une variable std::string , tu dois passer à la fonction fopen cet argument : fichier.c_str() et pas fichier !
    ça plante car il y'avait une erreur d'accés à la mémoire donc à une variable , bah c'est la seul solution que je connais .

    @+ Bouazza
    Forum Programmation d'OS - Tutoriel pour créer un petit noyau 32 bits .

    ( le développement de littlefoot86 est abandonné ... )

Discussions similaires

  1. [débutant] problème avec les nombres aléatoires
    Par happylife925 dans le forum Débuter
    Réponses: 12
    Dernier message: 10/03/2006, 15h47
  2. [Débutant] Problèmes avec les tableaux.
    Par Lwq dans le forum C++
    Réponses: 6
    Dernier message: 01/11/2005, 12h54
  3. Réponses: 5
    Dernier message: 04/09/2005, 12h34
  4. [Débutant] Problème avec les paramètres d'une proc stockée
    Par babulior dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 28/06/2005, 15h38
  5. [Débutant]Problème avec les timers
    Par mickael777 dans le forum MFC
    Réponses: 1
    Dernier message: 11/04/2005, 11h00

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