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 :

comparaison, type de fichier ? segmentation fault incomprise


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 26
    Par défaut comparaison, type de fichier ? segmentation fault incomprise
    Bonjour

    Je fais un programme pour remplir les fichiers (texte) d'un dossier et leur fixer un taille.

    Je pense que celui-ci ne peut marcher qu'avec des fichiers textes et surtout ne doit se modifier lui-même. Donc j'ai fait un test pour le passer.

    avec gdb le segmentation fault apparait pour un fwrite des includes standard, donc je pense que c'est un probleme du fichier dans lequelle j'essaye d'écrire.

    (Le problème ne doit pas venir du main)

    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <dirent.h>
    #include <sys/stat.h>
     
    void liste(char *,char *);
    int taille(char *,int);
     
    int main(int argc,char *argv[]){ /*en argument on donne la taille mais je ne l'utilise pas pour le moment*/
    	char *nmprog;
    	nmprog=malloc(sizeof(argv[0]));
    	nmprog=argv[0];
    	int i=2;
    	while (nmprog[i] != '\0'){
    		nmprog[i-2]=nmprog[i];
    		i++;
    	}
    	nmprog[i-2]='\0';
     
    	if (argc != 2)
    		printf("donner la taille en octets\n");
    	else
    		liste(".",nmprog);
    	return 0;
    }
     
    void liste(char *rep,char *nmprog){
    	DIR *dossier;
    	struct dirent *fichier;
    	struct stat temp;
     
    	if( NULL != ( dossier = opendir(rep))){
    		readdir(dossier);readdir(dossier); /*pour passer le dossiers courant et parent*/
    		while( NULL != ( fichier = readdir(dossier))) {
    			if (-1 == stat(fichier->d_name, &temp))
    				return;
    			if ((temp.st_mode & S_IFMT) == S_IFDIR)//c'est un dossier donc pas à remplir
    				continue;
    			if ((fichier->d_name) != nmprog)
    				taille(fichier->d_name, 10);
    		}
    		closedir(dossier);
    	}
    }
     
    int taille(char *nom,int taille){/*arguments : nom du fichier texte puis taille en Ko*/
        FILE *fichiero;
     
        int i;
     
     
    	fichiero = fopen(nom, "a");
     
    	for (i=0;i<(taille*50);i++)
     
            fprintf (fichiero, "c'est du remplissage");
     
    	return 0;
    }
    Le probème vient sans doute de taille qui écrit dans le fichier.

    Merci pour toutes les aides que vous pourrez m'apporter.

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	char *nmprog;
    	nmprog=malloc(sizeof(argv[0]));
    	nmprog=argv[0];
    Rien que ça, c'est déjà désastreux. Ça ne donne pas envie de lire la suite.
    Enfin, après relecture, je comprends que tu voulais faire une copie. Tu dois utiliser la fonction strlen(), ajouter 1 pour le caractère nul, et utiliser strcpy() pour la copie.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	int i=2;
    	while (nmprog[i] != '\0'){
    		nmprog[i-2]=nmprog[i];
    		i++;
    	}
    Pourquoi pas une boucle for?
    Epitech?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void liste(char *rep,char *nmprog){
    const char *, ce n'est pas pour les chiens.
    D'un autre côté, trop de profs n'en apprennent l'existence à leurs élèves que très tard... Quand ils n'oublient pas tout simplement de le faire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ((fichier->d_name) != nmprog)
    Ce n'est pas ainsi qu'on compare deux chaînes de caractères en C: Utilise la fonction strcmp().

    PS: fclose(), ce n'est pas pour les chiens non plus. Là, tu n'as pas d'excuse par contre.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 26
    Par défaut
    Merci pour la réponse.
    J'apprends tout seule le c donc c'est normale qu'il y ai toutes ces erreurs (désolé).

    déjà je n'avais jamais utilisé string.h d'où l'absence de strcpy ...

    code modifié :
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <dirent.h>
    #include <sys/stat.h>
    #include <string.h>
     
    void liste(const char *,const char *,const int);
    int taille(char *,int);
     
    int main(int argc,char *argv[]){ /*en argument on donne la taille*/
    	char *nmprog;
    	nmprog=malloc(strlen(argv[0])-2);
    	strcpy(nmprog,(argv[0]+2));
     
    	if (argc != 2)
    		printf("donner la taille en octets\n");
    	else
    		liste(".",nmprog,atoi(argv[1]));
    	return 0;
    }
     
    void liste(const char *rep,const char *nmprog, const int sz){
    	DIR *dossier;
    	struct dirent *fichier;
    	struct stat temp;
     
    	if( NULL != ( dossier = opendir(rep))){
    		readdir(dossier);readdir(dossier); /*pour passer le dossiers courant et parent*/
    		while( NULL != ( fichier = readdir(dossier))) {
    			if (-1 == stat(fichier->d_name, &temp))
    				return;
    			if ((temp.st_mode & S_IFMT) == S_IFDIR)//c'est un dossier donc pas à remplir
    				continue;
    			if (0 != strcmp((fichier->d_name),nmprog))
    				taille(fichier->d_name, sz);
    		}
    		closedir(dossier);
    	}
    }
     
    int taille(char *nom,int taille){/*arguments : nom du fichier texte puis taille en Ko*/
        FILE *fichiero;
     
        int i;
     
     
    	fichiero = fopen(nom, "a");
     
    	for (i=0;i<(taille*50);i++)
     
            fprintf (fichiero, "c'est du remplissage");
        fclose(fichiero);
     
    	return 0;
    }
    (il fonctionne)

    juste est-ce que vous pourriez m'indiquer d'où venait le segmentation fault ??

    Merci.

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Bonjour,
    Je ne sais pas en détail d'où elle venait, car je n'ai pas testé ton code.
    L'important, c'est qu'on corrige les erreurs. Quand le code n'a aucune erreur, il n'a pas de segfault...

    PS:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    nmprog = malloc(strlen(argv[0])-2+1);
    Chaque chaîne de caractères est terminée par un caractère nul. Si on recopie une chaîne, il faut allouer la place pour ce caractère nul.

    Exemple:
    Une chaîne "abc" est stockée ainsi: {'a', 'b', 'c', 0}. strlen("abc") retourne 3, mais la taille nécessaire est 4. Donc, on utilise strlen("abc")+1.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 26
    Par défaut
    ok merci

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

Discussions similaires

  1. une erreur du type Segmentation fault
    Par bae84 dans le forum Débuter
    Réponses: 8
    Dernier message: 16/12/2011, 16h34
  2. [Segmentation Fault] QVector<type*>.resize()
    Par ailonn dans le forum Débuter
    Réponses: 4
    Dernier message: 15/02/2010, 15h34
  3. Réponses: 10
    Dernier message: 18/11/2003, 18h01
  4. Comment contrer la "segmentation fault" ?
    Par guillaume_pfr dans le forum C
    Réponses: 15
    Dernier message: 08/08/2003, 13h43
  5. Bloquer le téléchargement de certains types de fichiers
    Par Nikos dans le forum Développement
    Réponses: 4
    Dernier message: 23/12/2002, 20h54

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