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 :

Comprendre lseek et atoi


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Octobre 2013
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Comprendre lseek et atoi
    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
    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 d’entiers.
     // 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;
     }
    On souhaite modifier trier pour ne prendre en compte qu’une sous-partie du fichier. Pour cela, on ajoute deux
    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:
    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);
    Merci de m'aider à comprendre.

  2. #2
    Membre expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 532
    Points
    3 532
    Par défaut
    Il doit te manquer des arguments dans l'utilisation...
    Parce qu'argv[1] je vois bien ce que c'est (le nom de fichier...), mais argv[2] et argv[3]...

    lseek : ça permet de se positionner à un endroit précis dans le fichier.
    SEEK_SET : en se décalant d'une offset depuis le début du fichier
    SEEK_CUR : en se décalant d'une offset depuis la position courante dans le fichier
    SEEK_END : en se décalant d'une offset depuis la fin de fichier (à reculons).

    atoi = ASCII to Integer = transformer des caractères ASCII en un entier "int" au format 32 bits signé (0000 = 0, A000 = -1, 0001 = 1, ...)
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  3. #3
    Nouveau Candidat au Club
    Femme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Octobre 2013
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Merci pour ta réponse. D'après ce que je comprends, à la fin de la ligne 15 la variable len aura comme valeur la taille du fichier. Ce que je ne comprends pas c'est en quoi le code de la solution peut remplacer les lignes 14 et 15. Ensuite pourquoi la fonction lseek qui est est sensée recevoir trois paramètres (int fd, off_t offset, int whence) n' en reçoit que deux?

  4. #4
    Membre expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 532
    Points
    3 532
    Par défaut
    Le 3e paramètre est parfois oublié... s'il n'est pas indiqué.... je... ne vais pas m'avancer.... mais il me semble que ça démarre depuis le début du fichier.
    (attention, je m'étais fais avoir sur un autre syscall "open" où en oubliant des paramètres, il ouvrait "n'importe comment" le fichier... ce qui faisait qu'à la création ça foirait totalement)
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  5. #5
    Nouveau Candidat au Club
    Femme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Octobre 2013
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Ok. Mais je ne vois pas toujours comment a la fin du code de la solution la variable len aura comme valeur la taille du fichier??

  6. #6
    Membre expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 532
    Points
    3 532
    Par défaut
    Ah nonononon !

    La taille du fichier n'est pas obtenue par la lecture du contenu !
    On la demande au FS directement via le syscall fstat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct stat  file_attributes;
     
    fstat(fd, &file_attributes);
    len = file_attributes.st_size;
    La struct stat contient pleins d'infos utiles sur les fichiers, et elle est issue de ce que le filesystem stocke "à propos des fichiers".
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Attention, le comportement de fseek()/lseek() sur des fichiers ouverts en mode texte est indéterminé si on ne lui passe pas une valeur explicitement retournée par ftell().

    Ici, puisque tu lis directement des entiers, la bonne solution est d'ouvrir ton fichier en mode binaire, en rajoutant le flag O_BINARY.
    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.

  8. #8
    Nouveau Candidat au Club
    Femme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Octobre 2013
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Merci à vous

  9. #9
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    Quand je compile le programme trier.C, cela ne marche pas, il semble qu'il manque des choses dans le programme.
    Pourriez-vous m'aider à le corriger?

    Merci

Discussions similaires

  1. Réponses: 12
    Dernier message: 08/02/2005, 23h42
  2. [langage] comprendre une syntaxe particulière
    Par mat21 dans le forum Langage
    Réponses: 4
    Dernier message: 08/12/2004, 18h12
  3. [Concept][JavaBeans] Comprendre ?
    Par nicoo dans le forum Langage
    Réponses: 15
    Dernier message: 08/12/2004, 08h01
  4. [Procédure][java] A n'y rien comprendre
    Par Stessy dans le forum SQL
    Réponses: 2
    Dernier message: 18/03/2004, 15h05
  5. problème avec atoi()
    Par ouckileou dans le forum C
    Réponses: 3
    Dernier message: 29/11/2003, 19h21

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