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 :

lecture d'un fichier sous linux


Sujet :

C

  1. #1
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2012
    Messages : 14
    Par défaut lecture d'un fichier sous linux
    salut! j'ai écrit un programme qui marche parfaitement sur windows mais une fois sur linux il y a des segmentation fault je ne sais pas ou est le problème le fichier à lire étant bien dans le même dossier que le programme.de l'aide svp

    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
     
    #include "stdio.h"
    #include <string.h>
    /*------------------------------------------------------
    	-- fonction qui permet de lire un fichier
    ---------------------------------------------------------*/
    void read_file()
    {
    	char n;
    	char m;
    	int p;
     
    	FILE *fp;
            fp=fopen("read_file","rt");   //ouverture du fichier
    	if(fp==NULL){
            	printf("le fichier read_file.txt ne peut pas etre ouvert ou cree");
            	//exit(0);
    	}
    	fscanf(fp,"%d\n", &nbr_sommet);
    	while(n != '!'){
    		fscanf(fp,"%c\r%c\r%d\t", &n,&m,&p);  //lit successivement deux caractères(nom des sommets) et un entier(valuation)
    		matrice[n-64][m-64] = p ;             //utilisation du code ascii pour passer des chiffres aux lettres(minuscule)
    		matrice[m-64][n-64] = p ;
    	}   
    	fclose(fp);    
    }

  2. #2
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 274
    Par défaut
    Pourrais tu donner un peu plus d'informations, notamment sur la variable "matrice" ? Et utilises-tu un debugger pour voir d'où provient exactement l'erreur ?

  3. #3
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Plutôt que d'utiliser une variable globale, pourquoi ne pas la transmettre en paramètre?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    void read_file(Type ** matrice, int * nbreSommet);
    //ou
    void read_file(Type * matrice[100], int * nbreSommet);//100 est pris arbitrairement vu qu'on pas pas d'information sur matrice.
    Sinon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    matrice[n-64][m-64] = p ;             //utilisation du code ascii pour passer des chiffres aux lettres(minuscule)
    matrice[m-64][n-64] = p ;
    Tu vérifies quand que n-64 et m-64 sont inférieur au nombre de colonne et au nombre de ligne de ta matrice ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    	while(n != '!'){
    		fscanf(fp,"%c\r%c\r%d\t", &n,&m,&p);  //lit successivement deux caractères(nom des sommets) et un entier(valuation)
    		matrice[n-64][m-64] = p ;             //utilisation du code ascii pour passer des chiffres aux lettres(minuscule)
    		matrice[m-64][n-64] = p ;
    	}
    Si je comprend bien quand n='!', tu quittes ta boucle. Mais est-ce que les valeurs de m et p que tu lis lorsque n = '!' sont à inscrire dans ta matrice ?

    Que ce passe-t-il si tu rencontre une erreur lors de la lecture ?

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Le code original ne compile pas puisqu'on n'a pas la définition des variables globales (comme dit par Neckara, ce n'est pas une très bonne méthode).

    Ensuite, cette boucle est surement a revoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	while(n != '!'){
    		fscanf(fp,"%c\r%c\r%d\t", &n,&m,&p);  //lit successivement deux caractères(nom des sommets) et un entier(valuation)
    		matrice[n-64][m-64] = p ;             //utilisation du code ascii pour passer des chiffres aux lettres(minuscule)
    		matrice[m-64][n-64] = p ;
    	}[m-64][n-64] = p ;
    L'erreur de segmentation est sûrement ici. Es-tu sûr que la mémoire allouée (statiquement ou dynamiquement) est suffisante pour recevoir le contenu du fichier ?
    De plus, si n==! après le scanf(), tu écris quand même dans la matrice : souhaites-tu vraiment le faire ?

    PS : \r dans la chaine formatée ? Je ne comprends pas très bien

  5. #5
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    - Le modificateur "t" dans "rt" est non standard. "r" suffit pour un fichier texte

    - Le format utilisé est intriguant (les '\r' et le '\t') : fscanf(fp,"%c\r%c\r%d\t", &n,&m,&p);. Comment est composé le fichier ? Attention à ce que les caractères de fin de lignes sont différents dans un fichier "Windows", "Unix" et "Mac".

    - Vérifier que la lecture est correcte en controlant le retour de fscanf() if(fscanf(......) != 3).... // erreur de lecture.

    - Vérifier aussi (en plus de la remarque de Neckara) que n et m sont >='@' (ascii 64) (d'ailleurs n'est-ce pas plutôt 'A' ?)

  6. #6
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par diogene Voir le message
    Attention à ce que les caractères de fin de lignes sont différents dans un fichier "Windows", "Unix" et "Mac".
    Depuis la version 10, le caractère de fin de ligne sous Mac est LF comme sous Linux. Contrairement à Mac OS 9 et les versions précédentes où c'était CR. La version 10 étant apparu en 2002, il est peu probable d'avoir encore affaire à ça de nos jours ^^
    Lien utile : http://en.wikipedia.org/wiki/Newline#Representations

  7. #7
    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
    n n'est pas initialisé avant la boule while(), le résultat de fscanf() n'est pas testé...
    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.

Discussions similaires

  1. probleme de lecture de fichier sous Linux
    Par hbellahc dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 04/07/2008, 15h08
  2. Téléchargement de fichier sous Linux
    Par patrick_lassaly dans le forum Administration système
    Réponses: 1
    Dernier message: 03/01/2006, 11h31
  3. fichier sous linux
    Par razord dans le forum C
    Réponses: 2
    Dernier message: 19/09/2005, 11h54
  4. Exclusivité sur un fichier sous linux
    Par ggnore dans le forum Administration système
    Réponses: 4
    Dernier message: 03/11/2004, 09h46
  5. Les fichiers sous linux/windows
    Par Stessy dans le forum Linux
    Réponses: 5
    Dernier message: 05/12/2003, 09h30

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