Bonjour à tous, Je ne comprends pas la solution de cet exercice:
On dispose d’un programme trier capable de trier un fichier d’entiers et d’envoyer le résultat (dans le même
format) sur sa sortie standard. Les entiers sont stockés dans le même format que le format binaire natif du processeur. Pour afficher le résultat sous forme lisible, on utilise donc un programme afficher qui imprime sous forme
décimale les entiers lus sur l’entrée standard.
> cat fichier | afficher
7 2 6 8 1
> trier fichier | afficher
1 2 6 7 8
trier.c
On souhaite modifier trier pour ne prendre en compte qu’une sous-partie du fichier. Pour cela, on ajoute deux
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 // La fonction suivante permet de trier un tableau dentiers. // On ne demande pas décrire son code. extern void sort (int * array , unsigned nb_integers ); int main (int argc , char * argv []) { int fd ; unsigned len ; int * buf ; struct stat file_attributes ; fd = open ( argv [1] , O_RDONLY ); fstat (fd , & file_attributes ); len = file_attributes . st_size ; buf = malloc ( len ); read (fd , buf , len ); sort (buf , len / sizeof(int)); write ( STDOUT_FILENO , buf , len ); return 0; }
arguments qui représentent respectivement la position du premier entier du segment à considérer et le nombre
d’entiers à traiter. Voici deux exemples illustrant le nouveau fonctionnement de trier :
> trier fichier 0 3 | afficher
2 6 7
> trier fichier 3 2 | afficher
1 8
Question: Donnez le code remplaçant les lignes 14 et 15 afin de prendre en compte les deux nouveaux paramètres. On
pourra utiliser les fonctions bien connues off_t lseek(int fd, off_t offset, int whence) (où whence
prendra une valeur dans SEEK_SET, SEEK_CUR, SEEK_END) et int atoi(char *s).
La réponse est:
Merci de m'aider à comprendre.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 lseek(fd, atoi(argv[2])*sizeof(int)); len = atoi(argv[3])*sizeof(int);
Partager