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 :

recherche d'une fonction pour savoir si un buffer est NULL


Sujet :

C

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 168
    Points : 140
    Points
    140
    Par défaut recherche d'une fonction pour savoir si un buffer est NULL
    Bonjour,

    dans le cadre d'un tp on me demande de savoir si un fichier contient un trou et si c'est le cas que lors de la recopie il soit détécté et recrée dans un fichier de sauvegarde grace a lseek.

    Seulement pour ce faire il faut lire dans le fichier et voir si le buffer lu est vide.

    Or le prof nous a dit qu'il existait une fonction qui permettait de savoir si le buffer était null, celle ci est écrite en assembleur et est donc plus rapide que la fonction lambda que je pourrais écrire. Seul problème, il ne nous a pas donné le nom de la fonction ni le .h qui la contient.

    J'aimerais savoir si l'un dentre vous connaitrait cette fonction.

    Merci bien

  2. #2
    Membre expérimenté
    Avatar de granquet
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 201
    Points : 1 421
    Points
    1 421
    Par défaut
    j'ai pas compris la question ... je vais donc tenter une reponse au pif.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    char buffer[128];
    mafonctiondelecture(buffer,128);
    if (strlen(buffer) == 0)
    fprintf(stderr,"buffer vide");
    click my www
    ............|___
    ...................\
    .................._|_
    ..................\ /
    ..................."

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 168
    Points : 140
    Points
    140
    Par défaut
    En systeme quand il y a un trou dans un fichier, il est composé de 0. En faite une suite de 0 correspond a un trou, car lorsque l'on déplace le curseur en laissant un vide, le système met des 0 pour combler le trou.

    Ce que je fais c'est que je lis une portion avec Read . Cette portion est contenue dans un char buffer[TMAX]. Et si jamais je lis un trou ce dernier sera quand même plein de 0, donc le strlen ne marchera pas

    Ce que je cherche c'est une fonction prédéfini qui permet de savoir si mon buffer est plein de 0 (à ne pas confondre avec le caractere 0 ).

    Mais merci de ta proposition

  4. #4
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Je ne connais pas une telle fonction, regarde p-e du cote de memcmp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    char *buffer2 = malloc(sizeof(buffer)); // un buffer de la meme taille que buffer
    memset(buffer2, 0, sizeof(buffer));
    if(memcmp(buffer, buffer2, sizeof(buffer)) == 0) {
        ...
    }
    Cest vraiment pas beau mais bon.

    Et pourquoi tu ne demandes pas a ton prof???
    Introduction à Silverlight 4 (new) ; Localisation d'une application Silverlight (new) ;
    Mon espace perso[/B]

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. Albert Einstein[/SIZE]

  5. #5
    Membre expérimenté
    Avatar de granquet
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 201
    Points : 1 421
    Points
    1 421
    Par défaut
    euh? j'ai rien compris
    http://www.lookuptables.com/

    la valeur 0 correspond au caractere 'NULL' qui marque une fin de chaine de charactere.
    strlen compte le nombre de charactere entre le pointeur qui lui as ete passé et le premier 0 qu'il rencontre.

    ce que je comprend de ton probleme: t'as un tableau de char qui contient ton fichier avec des suites de 0 au milieu.
    tu veux eliminer ces suites de 0?
    moi je ferais un strlen(buffer), je fait un malloc(realloc) de la taille de strlen, j'y fait un strncpy pour copier le bout de buffer dans ma "var dynamique".
    je deplace mon pointeur buffer jusqu'a trouver autre chose qu'un 0, et je recommence mon cirque strlen realloc ...

    maintenant j'ai peut etre pas compris le probleme !
    click my www
    ............|___
    ...................\
    .................._|_
    ..................\ /
    ..................."

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 168
    Points : 140
    Points
    140
    Par défaut
    Pour la demande au prof , il m'est impossible de le joindre
    Et on doit lui poster le travail sur son compte.

    Pour dark Ebola : en faite j'ai pas un tableau de caractere qui contient mon fichier.
    Je lis un certain nombre de caractere dans un buffer Effectivement je peux avoir une suite de 0 au milieu voir que le buffer ne contienne que des 0.

    EN faite j'ai un seul truc a faire : savoir si mon buffer est vide et si il est vide sauté le nombre de case du buffer, avec un lseek.(la copie doit être intelligente pas parfaite)

    C'est pour cela que je cherche une fonction syteme qui peut me renvoyer si le buffer est vide ou pas, vu qu'il est sencé en existé une (caché quelque part dans les centaines de .h).

    Pour l'usage de strlen, que se passerait il si j'ai des zéros au début ?
    Il me rendrait 0, donc je pourrais croire que le buffer est vide mais il pourrait contenir un caractere a la 8000 eme case.

    De plus j'ai un doute sur le fait que ce soit une fonction systemes.

  7. #7
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Je ne connais pas cette fonction, si tant est qu'elle existe en C.

    Un buffer NULL celà ne veut rien dire, vide oui.

    Maintenant, comme les autres, je n'ai rien compris à ton problème, tu parles de trou dans le fichier et de recopier grâce à lseek : : :

    Citation Envoyé par Drannor
    dans le cadre d'un tp on me demande de savoir si un fichier contient un trou et si c'est le cas que lors de la recopie il soit détécté et recrée dans un fichier de sauvegarde grace a lseek.

    Seulement pour ce faire il faut lire dans le fichier et voir si le buffer lu est vide.
    Quel buffer est vide ? tu lis tout le fichier d'un seul coup ? Portion par portion ?
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 168
    Points : 140
    Points
    140
    Par défaut
    Portion par portion et désolé pour l'abus de language entre buffer NULL et vide

    La question exacte : Ecrire tcopier , qui détecte les trous dans le fichier source et les recrée dans le fichier destination avec la primitive lseek(2).Ceci permet d'éviter d'allouer des blocks pleins de zéro dans le fichier destination et ainsi gagner de la place sur le disque.
    Donc ma question est : Quel fonction systeme dit si un buffer de taille TMAX à toutes ses cases remplit de 0.

  9. #9
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Donc ma question est : Quel fonction systeme dit si un buffer de taille TMAX à toutes ses cases remplit de 0.
    memcmp.
    Voir le code de Skyrunner.

    À part ça la notion de trou dans un fichier ne veut rien dire.
    Enfin ça a peut-être du sens pour un fichier texte, mais en tous cas pas en général.
    Les octets nuls dans certains fichiers ont du sens, ce n'est pas un simple trou.
    Boost ftw

  10. #10
    Membre expérimenté
    Avatar de granquet
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 201
    Points : 1 421
    Points
    1 421
    Par défaut
    hmm ... l'ennoncé est "bizarre".

    pour moi, creer des suites de 0 c'est utiliser de la place ...
    et donc je vois pas le gain de place dans le fichier destination.

    gagner de la place en remplacant une suite repetitive oui ... mais en les remplacant par un token particulier indiquant le nombre de fois que le motif se repete, je vois tout a fait ou est le gain de place.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
           The lseek() function allows the file offset to be set beyond the end of
           the existing end-of-file of the file (but this does not change the size
           of the file).  If data is later written at this point, subsequent reads
           of the data in the gap return null bytes ('\0') until data is  actually
           written into the gap.
    mon anglais est peut etre mauvais ... si tu pouvais m'eclairer un peu plus !

    je suis autodidacte (pour le C, pas l'anglais), c'est peut etre pour moi l'occasion d'apprendre quelque chose ...
    click my www
    ............|___
    ...................\
    .................._|_
    ..................\ /
    ..................."

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 168
    Points : 140
    Points
    140
    Par défaut
    La définition est bonne : ce que j'ai marqué dans mon cours est :

    Lseek :
    *Syntaxe :
    #include <sys/types.h>
    off_t lseek(int fd, off_t offset, int whence)

    *Retour :
    *nouvelle position si Ok
    *-1, erreur

    * Semantique :
    * place le curseur à la position origine + offset, ou origine est spécifié par whence
    *aujourd'hui off_t correspond a un entier de 64 bits
    * whence : origine du deplacement :
    - SEEK_SET => Debut de fichier ;
    - SEEK_CUR => position courante du curseur
    - SEEK_END => fin du fichier

    *une position negative est le plus souvent une erreur mais on peu dépasser la fin de fichier (fdf)

    * si le curseur est placé apres la fdf, toute écriture crée est "un trou" et replace la EOF. La lecture d'un trou rend les octets nuls.

    *pour connaitre la position du curseur. Il suffit d'éxecuter :
    p = lseek(fd,0,SEEK_CUR).

    Voila ce que j'ai sur mon superbe polycope. Le faite est que ce que j'ai compris c'est que si je recopie betement source dans destination avec les 0 au millieu le fichier destination prend du poid inutilement alors qu'avec un déplacement de curseur ce n'est pas le cas.

    Peut être qu'au moment ou l'on ouvre le fichier, le systeme se charge de remplir les trous de 0 pour que le fichier txt soit lisible mais en tout cas ils n'y sont pas dans le fichier donc celui ci serait plus léger.

    Enfin voila si cela peut t'aider ( et felicitation pour ton apprentissage autodidacte du c ).

    Sinon je cherche toujours la fonction magique qui dit si un buffer est vide ou non (enfin je vais tester voir si ce n'est pas memcmp )

  12. #12
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    La seule manière que je voie est le test de chaque caractère.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  13. #13
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Peut-être pensait-il à strcspn.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  14. #14
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Ne marche pas si le premier caractère du buffer est 0, et même il faudrait passer une chaîne de 255 caractères il me semble.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  15. #15
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 147
    Points : 155
    Points
    155
    Par défaut
    Parcourir le buffer pour voir sil est rempli de 0 ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    int buffer_vide&#40;buffer&#41; 
    &#123;
      int i;
      for &#40;i = 0; i < TAILLE_DU_BUFFER; ++i&#41;
      &#123;
        if &#40;buffer&#91;i&#93; != 0&#41;
          return 0;
      &#125;
      return 1;
    &#125;
    Mais je confirme, ton propre est dur à cerner

    lseek permet de se deplacer sur un file descriptor ... c'est pas super recommandé ceci dit ... je doute que ce soit lseek, car en plus lseek va travailler sur les fd donc sur le disk dur si je ne me trompe, alors que les buffer sont en mémoire, donc plus performants ...

  16. #16
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    dans le cadre d'un tp on me demande de savoir si un fichier contient un trou et si c'est le cas que lors de la recopie il soit détécté et recrée dans un fichier de sauvegarde grace a lseek.
    Cela ne marcherait pas. Le problème des sparse files, c'est qu'en faisant une lecture avec fread (ou autre équivalent), on peut remarquer qu'il y a des zéros mais comment savoir que cela fait partie du trou ou non? Il se peut très bien que certains des zéros ne font pas partie du "trou". Ce qui veut dire que même si à la lecture, on obtiendra la même chose, on n'a pas vraiment le même fichier.

    Prenons un exemple:

    Supposons qu'on a un fichier avec un trou de 1024 octets, 10 caractères de valeurs 0 et ensuite 1024 octets de trous. En voulant faire une copie du fichier, on regarde un tampon et si tous les caractères sont nuls, on le déclare être un trou. Donc pour mon fichier exemple finalement tout est un trou. Finalement, aucun caractère ne sera écrit, le fichier sera ouvert et fermé sans une écriture (juste des lseek) donc nous n'aurons pas la bonne taille.

    Bien sûr, il y a une solution: il suffirait de voir s'il y a eu une écriture après le dernier saut et si non, on revient d'un caractère et on met un 0 pour donner la bonne taille de fichier.

    Jc

    PS: Sinon pour la comparaison, une comparaison à la main est probablement la seule bonne solution...

  17. #17
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 168
    Points : 140
    Points
    140
    Par défaut
    Je ne sais pas si la question ets intelligente ou non mais c'est celle que le prof nous demande

    Ca j'y peux rien lol
    Mais dans ce que tu me dit fear, dans mon énoncé les 0 caractères serait considérait comme un trou donc sauté.

    Sinon pour Sylk oui c'est bien Lseek qu'il faut user c'est marqué dans la question que j'ai mise un peu plus haut et comme je l'ai dit dans le premier message c'est un tp donc c'est pour nous apprendre juste a user d'un lseek.

    Mais merci beaucoup a vous tous.
    Des que j'ai la réponse je la marquerais.

  18. #18
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Drannor
    Ce que je cherche c'est une fonction prédéfini qui permet de savoir si mon buffer est plein de 0 (à ne pas confondre avec le caractere 0 ).
    Il n'y a évidemment pas de fonction prédéfinie, mais tu fais une lecture du fichier en mode binaire avec fgetc() et tu comptes les 0 ou séquences de 0 consécutifs selon tes critères d'analyse qui ne sont pas très clairs... C'est une question d'algorithme et non de C.
    Pas de Wi-Fi à la maison : CPL

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 09/02/2009, 15h28
  2. Recherche d'une fonction lua pour convertir des caractères accentués
    Par Jerome78 dans le forum Développement 2D, 3D et Jeux
    Réponses: 1
    Dernier message: 21/11/2008, 12h37
  3. je recherche une fonction pour trouver le minimum
    Par laxe13 dans le forum Langage
    Réponses: 1
    Dernier message: 03/08/2008, 01h55
  4. Réponses: 13
    Dernier message: 31/03/2008, 10h14
  5. Fonction pour savoir si un ordi est connecté au reseau
    Par LitteulKevin dans le forum Windows
    Réponses: 17
    Dernier message: 13/09/2004, 15h12

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