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

Linux Discussion :

Problème de lecture dans un fichier (C, unistd.h)


Sujet :

Linux

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Problème de lecture dans un fichier (C, unistd.h)
    Bonjour à tous, et merci d'avoir pris le temps d'ouvrir mon post.

    Voici mon problème :

    J'écris une fonction qui récupère le contenu d'un champ dans un fichier.

    J'ai d'abord besoin de positionner la tête de lecture à un endroit précis.
    Cet endroit est caractérisé par les deux premiers caractères de la ligne qui le contient (le chiffre 1 suivi d'une tabulation).

    Pour localiser cette ligne, je lis le fichier jusqu'à atteindre ces deux caractères.
    J'utilise une variable que j'appelle INIT (char INIT[2] ;), et l'appel système read (de la librairie unistd.h).
    La lecture est conditionnelle : tant que INIT est différent des deux caractères à localiser, la lecture se poursuit.

    while (strcmp(INIT, "1\t") != 0)
    {
    NEXT_LINE(FD) ;
    SAFE_READ_2 ;
    }


    La fonction auxiliaire NEXT_LINE me permet de passer d'une ligne à l'autre dans le fichier.
    SAFE_READ_2 est une macro représentant la lecture de deux caractères :

    # define SAFE_READ_2 {if (read(FD, INIT, 2) != 2*sizeof(char)) {perror("Unable to read file") ; errno = 0 ; exit(EXIT_FAILURE) ;}}.

    Mon problème est le suivant : je déclare INIT comme une variable locale sur un espace mémoire de deux caractères, et à l'appel de read, j'indique donc une lecture de deux caractères dans le fichier.

    Pas de problème lors de la compilation ; mais à l'éxécution, ma variable INIT contient 6 caractères.
    Après quelques tests, j'ai observé qu'avant tout appel de read, ma variable INIT, malgré sa déclaration (char INIT[2] ;), est déjà représentée en mémoire par un espace de 6 caractères.

    Je sèche complètement. Quelqu'un aurait-il une idée ?

    En vous remerciant de m'avoir lu,

    Scott.

    Ci-joint, le code de la fonction en question :

    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
    char * EXTRACT_FIELD(int LINE, int FIELD, char * PATHNAME)
    /*
     * Renvoi le contenu du champs numéroté par FIELD de la ligne numérotée par LINE 
     * dans le fichier accessible par PATHNAME.
     *
     */
    {
    	char INIT[2], CURRENT[1], * CONTENT ;
    	int i, FD ;
    	string_d * STRING ;
     
    	printf("%s\n", INIT) ;
     
    	FD = open(PATHNAME, O_RDONLY) ;
     
    	if (FD <= 0)
    	{
    		perror("[EXTRACT_FIELD] : Unable to open file") ;
    		errno = 0 ;
    		exit(EXIT_FAILURE) ;
    	}
     
    	SAFE_READ_2 ;
     
    	while (strcmp(INIT, "1\t") != 0)	// Positionnement sur le premier
    	{					// champ de la première ligne.
    		NEXT_LINE(FD) ;
    		SAFE_READ_2 ;
    	}
     
    	for (i = LINE ; i > 0 ; --i)		// Positionnement sur la ligne
    		NEXT_LINE(FD) ;			// numérotée par l'entier LINE.
     
    	for (i = FIELD ; i > 0 ; --i)		// Positionnement sur le champs
    		NEXT_FIELD(FD) ;		// numéro FIELD de la ligne LINE.
     
    	STRING = MAKE_STRING_D() ;		
    	SAFE_READ_1 ;
     
    	while (*CURRENT != '\t')			// Récupération du contenu du
    	{						// champ dans une chaine
    		ADD_STRING_D(STRING, CURRENT[0]) ;	// dynamique.
    		SAFE_READ_1 ;
    	}
     
    	CONTENT = STRING_D_to_STRING(STRING) ;
     
    	close(FD) ;
     
    	return CONTENT ;
    }

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 919
    Points : 220 492
    Points
    220 492
    Billets dans le blog
    127
    Par défaut
    Bonjour,

    Je pense avoir une idée \ o /
    En fait ... toute chaine de caractère doit être terminé par un '\0'. Dans la théorie votre méthode n'est pas fausse ... sauf que vous utilisez strcmp() pour savoir si vous avez votre "1\t". Mais ... strcmp() repère la fin d'un mot avec le '\0'. Donc pour corriger le problème il faut déclaré INIT avec une taille de 3 (pour que cela contienne deux caractères + le '\0') et initialisé le à 0 (pour être archi sur que le dernier caractère aura la valeur '\0' (qui est 0)).
    Maintenant, lorsque lirez les deux caractères ... vous aurea toujours un '\0' qui suit, et donc strcmp() fonctionnera comme voulu.

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Alors là...
    Une preuve supplémentaire de l'utilité du travail d'équipe.
    J'ai passé un temps fou à lire et relire toutes mes sources, sans buter un seul instant sur une erreur pourtant élémentaire !

    Tout fonctionne, MERCI !

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

Discussions similaires

  1. [C ANSI] Problème de lecture dans un fichier
    Par F0ul dans le forum Débuter
    Réponses: 7
    Dernier message: 06/02/2008, 15h00
  2. [POI] Problème écriture/lecture dans un fichier Excel
    Par steuve dans le forum Documents
    Réponses: 6
    Dernier message: 02/07/2007, 16h47
  3. Problème de lecture dans un fichier texte.
    Par Mike888 dans le forum C
    Réponses: 3
    Dernier message: 24/05/2007, 12h45
  4. problème de lecture dans un fichier
    Par phy4me dans le forum Fortran
    Réponses: 1
    Dernier message: 20/05/2007, 21h55
  5. Problème de lecture dans un fichier xml
    Par Pyra dans le forum Langage
    Réponses: 2
    Dernier message: 18/12/2005, 01h13

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