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 ;
}