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 :

Erreur de segmentation copie de fichier


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2013
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2013
    Messages : 70
    Par défaut Erreur de segmentation copie de fichier
    Bonjour,

    Je suis actuellement en train de faire un programme qui copie un fichier
    le stocke dans un tableau puis le recopie dans un fichier de sortie.

    Le problème est que je me trouve devant un segfault, dés que je rajoute
    la fonction CopyFile() (c'est pour ça qu'il est en commentaire)
    et je ne sais pas du tout comment régler ce problème j'ai voulu tester en
    mettant des printf() partout mais ça aide pas.

    Je vous remercie pour votre aide, si vous avez une idée !

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
     
    #include <stdio.h>
    #include <string.h>
    //#include "Prototype.h"
     
    #define TAILLE_MAX 20
     
    typedef struct{
    	 char InpName[TAILLE_MAX];
    	 char OutName[TAILLE_MAX];
    	 int cpt;
    	char tabImage[255];
    }Image;
    //Cette structure contient le nom du fichier d'entrée et sortie, elle compte le nombre de
    //caractère (cpt), et garde en mémoire le fichier récupéré
    void InpOutFile(Image *Im1);
    char * saisir_chaine(char * lpBuffer, int buf_size);
    void cptChar(Image *Im2);
    void CopyFile(Image *Im3);
     
    int main()
    {
    Image Im;
     
    InpOutFile(&Im);
    cptChar(&Im);
    //CopyFile(&Im);
     
    return 0;
    }
     
    void InpOutFile(Image *Im1)
    {
     
        FILE *pictureI=NULL;
        FILE *pictureO=NULL;
     
        printf("Ce programme permet de copier un fichier.\n");
        printf("source : ");
        saisir_chaine(Im1->InpName, sizeof(Im1->InpName));
     
        pictureI= fopen(Im1->InpName,"rb");
        		if(pictureI== NULL)
        		perror(Im1->InpName);
     
            printf("dest : ");
            saisir_chaine(Im1->OutName, sizeof(Im1->OutName));
     
            if (strcmp(Im1->InpName, Im1->OutName) == 0)
                printf("La source ne peut pas etre en meme temps la destination.\n");
            else
            {
            pictureO = fopen(Im1->OutName,"wb");
                    if (pictureO == NULL)
                    perror(Im1->OutName);
            }
            printf("fin code 1");
            close(pictureI);
            close(pictureO);
    }
     
    char * saisir_chaine(char * lpBuffer, int buf_size)
    {
        char * ret = fgets(lpBuffer, buf_size, stdin);
     
        if (ret != NULL)
        {
            char * p = strchr(lpBuffer, '\n');
            if (p != NULL)
                *p = '\0';
            else
            {
                int c;
     
                do
                    c = getchar();
                while (c != EOF && c != '\n');
            }
        }
        return ret;
    }
     
    void cptChar(Image *Im2)
    {
    	FILE *pictureI=NULL;
     
          pictureI= fopen(Im2->InpName,"rb");
          if(pictureI== NULL)
        		perror(Im2->InpName);
     
          while(fgetc(pictureI) != EOF)
          Im2->cpt++;
          //On compte le nombre de caractère
     
    	close(pictureI);
    	printf("fin code 2");
    }
     
    void CopyFile(Image *Im3)
    {
        FILE *pictureI=NULL;
        FILE *pictureO=NULL;
     
        char tab[Im3->cpt+1];
        printf("%c",Im3->cpt);
        int i=0;
     
         pictureI= fopen(Im3->InpName,"rb");
        		if(pictureI== NULL)
        		perror(Im3->InpName);
     
          pictureO = fopen(Im3->OutName,"wb");
                    if (pictureO == NULL)
                    perror(Im3->OutName);
     
        while( fgets(tab,Im3->cpt,pictureI) != NULL)
        {
        strcat(Im3->tabImage,tab);
        //Dés qu'on atteint un '\n' dans le fichier on stocke dans
        //un tableau qu'on concaténe avec le tableau complet
        }
     
        for(i=0;i<Im3->cpt;i++)
        {
        fputc(Im3->tabImage[i],pictureO);
        //On écrit dans le fichier de sortie ce qu'on a dans le tableau
        //en mémoire
        }
     
    	close(pictureI);
    	close(pictureO);
    }

  2. #2
    Membre éclairé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Par défaut
    Grâce à gdb on peut voir que le problème se situe à la ligne 118 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        strcat(Im3->tabImage,tab);
    Vérifie que la taille de ton tableau n'est pas trop petite (augmente significativement la taille de char tabImage[255]).

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2013
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2013
    Messages : 70
    Par défaut
    Ah oui c'est bien ça, je connaissais pas gdb je crois que je vais m'y mettre !

    Je te remercie

  4. #4
    Membre éclairé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Par défaut
    OK très bien, voilà pour commencer (juste une introduction)
    http://perso.ens-lyon.fr/daniel.hirs...cs/doc_gdb.pdf

    Par contre il faut que tu testes desormais qu'une fois concaténée, ta chaîne ne dépassera pas la taille que tu as fixée.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 23
    Dernier message: 14/03/2009, 15h57
  2. Réponses: 5
    Dernier message: 05/03/2008, 15h23
  3. Réponses: 1
    Dernier message: 29/12/2006, 20h12
  4. Copie de fichiers => message d'erreur
    Par Looping_V60 dans le forum Access
    Réponses: 5
    Dernier message: 27/10/2006, 11h53
  5. message d'erreurs sur copie de fichier
    Par screeminelle dans le forum C++
    Réponses: 9
    Dernier message: 01/11/2005, 14h21

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