Fgets pose probleme

Stephworlds Messages postés 16 Date d'inscription mercredi 7 mars 2007 Statut Membre Dernière intervention 16 avril 2007 - 13 mars 2007 à 10:54
Stephworlds Messages postés 16 Date d'inscription mercredi 7 mars 2007 Statut Membre Dernière intervention 16 avril 2007 - 15 mars 2007 à 12:30
Salut à tous
Je doit lire des données dans un fichier et écrire ce qui  est lu dans un autre  fichier. A la compilation ça marche nikel mais quand je la nce le programme :
Exception non gérée à 0x00402ee5 dans projet.exe : 0xC0000005:
Violation d'accès lors de la lecture de l'emplacement 0x00000068.
J'ai décomposé tous le programme et je me suis rendu compte que c'est le fgets qui pose probleme, mais je sais pas pourquoi.

voici le programme :

#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <conio.h>

void main (void)
{ // déclaration pour la lecture ecriture création des fichier textes

    FILE *p_historique;    //pour le fichier historique.txt
    FILE *p_user;    //pour le fichier user.txt
    char cHistorique[]="historique.txt";
    char cUser[]="user.txt";
    int index;
    char cDateHeure[19], cNumBadge[16];
    errno_t erreur;
    char ligne[50];
               
//------------------------------------------------------------------------------------------------------------------------------
        erreur = fopen_s(&p_historique, cHistorique, "w");  /* on ouvre un fichier en  write ce qui provoque la création de celui ci */
        if(erreur == 0){
            fprintf(p_historique, "%s ", cHistorique);
            fprintf(p_historique, "%s\n", cHistorique);
            fprintf(p_historique, "%s ", cHistorique);
            fprintf(p_historique, "%s\n", cHistorique);}
        fclose(p_historique);
//------------------------------------------------------------------------------------------------------------------------------
        erreur = fopen_s(&p_historique, cHistorique, "r");  // read
        if(erreur == 0){
            erreur = fopen_s(&p_user, cUser, "w");
            if(erreur == 0){
                while( fgets(ligne, 255, p_historique) ){ //lire jusqu'au retour ligne
                    for(index=0;index<=strlen(ligne);index++)
                    {
                        fprintf(p_user, "%s\n",ligne[index]);
                    }                  
                }
            }
        }
        fclose(p_user);
        fclose(p_historique);
       
}

si vous pouvez m'aider......

4 réponses

Stephworlds Messages postés 16 Date d'inscription mercredi 7 mars 2007 Statut Membre Dernière intervention 16 avril 2007
13 mars 2007 à 11:23
ça y est ça marche j'ai changé :
                while( fgets(ligne, 255, p_historique) ){ //lire jusqu'au retour ligne
                    for(index=0;index<=strlen(ligne);index++)
                    {
                        fprintf(p_user, "%s\n",ligne[index]);
                    }                  
                }

par :
                for (index = 0; !feof(p_historique); ++index) {
                                fgets(tab[index], 256, p_historique);
                                fprintf(p_user, "%s\n",tab[index]);
                }

Par contre dans le fichier cible, il y a :
        historique.txt historique.txt

        historique.txt historique.txt

        Ð¥•|

alors que dans le fichier source j'ai :
        historique.txt historique.txt
        historique.txt historique.txt

PS : merci [auteurdetail.aspx?ID=22790 AlexMAN]
0
Stephworlds Messages postés 16 Date d'inscription mercredi 7 mars 2007 Statut Membre Dernière intervention 16 avril 2007
13 mars 2007 à 11:53
reponse : pour le saut de ligne c'est qu'il y en a un dans le tableau et un dans le fprintf(p_user, "%s\n",ligne[index]);
et pour le Ð¥?| c'est que le prog lit une ligne apres la derniere j'ai contourné le probleme par :
               for (index = 0; !feof(p_historique); ++index) {
                    fgets(tab[index], 255, p_historique);
                }
                test=index;
                for (index = 0; index<test ; ++index) {
                    fprintf(p_user, "%s",tab[index]);
                }

Par contre j'arrive pas à savoir pourquoi mon premier prog plantait si quelqu'un pouvait m'expliquer.
De plus dans mon programme final il va faloir que je sépare une ligne en plusieurs partie : dans ce cas je veux un historique.txt dans chaque variable.
0
cs_Matt67 Messages postés 549 Date d'inscription samedi 6 septembre 2003 Statut Membre Dernière intervention 6 mars 2010 3
13 mars 2007 à 22:50
Bonsoir,

J'ai juste regarder le code de ton premier exemple :
ligne[index] = un caractere donc dans ton fprintf il ne faut pas mettre %s mais %c
sinon, c'est quoi ce fopen_s et errno_t ?
le prototype de la fonction est de ce style int main(); ou int main(int argc, char** argv); et de plus il doit retourner une valeur donc de type int.

Matt...
0
Stephworlds Messages postés 16 Date d'inscription mercredi 7 mars 2007 Statut Membre Dernière intervention 16 avril 2007
15 mars 2007 à 12:30
Pourtant quand je fait %s ça écrit dans le fichier. Je comprend pas....
Le fopen_s est pour ouvrir et creer le fichier, et errno_t est un type de variable (d'ou il vient? euh? faut demander a microsoft....)
Pour le main je compte faire un programme plus complet ça c'est du camboui pour test donc qu'il me retourne quelquechose ou pas je m'en fiche. Le truc c'est que dans mon programme final il va faloir que je sépare une ligne en plusieurs partie. C'est plutot ça mon gros soucis.
merci de ton aide
0
Rejoignez-nous