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

Réseau C Discussion :

[linux] differences read & fread


Sujet :

Réseau C

  1. #1
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    339
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 339
    Par défaut [linux] differences read & fread
    Salut à tous,

    Voilà, je dois lire des données binaires dans un fichier et des des données "texte" dans un autre. Je suppose qu'il n'y a pas de problèmes si je choisis read ou fread. Mais alors pourquoi avoir deux fonctions différentes pour faire la même chose ??? (Oui je sais, ils n'ont pas les même paramètres... ).
    Je sais que read peut s'utiliser pour une socket et fread en semble incapable... dans ce cas là pouquoi pas supprimer fread totalement ???

    Bon, à mon avis, j'ai du dire une c*****rie quelque part mais c'est justement là mon problème. Est-ce que quelqu'un aurait l'amabilité de m'expliquer rapidement ?

    Merci d'avance

  2. #2
    Membre émérite
    Avatar de Pouic
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 669
    Par défaut
    fread : conforme C ANSI (donc portable)
    read : conforme Posix.1 (donc potentiellement moins protable)

    read : par tradition, très utilisée dans les développements spécifiques *n*x.
    car read prend un descripteur de fichier (sur lequel on peut par ailleurs faire plein d'opérations)
    fread : préférable si le code est amené à voyager :-) (mais utilise un FILE* , moins maniable que le descripteur...)
    Software becomes slower faster than hardware becomes faster
    [size=1]
    http://xrenault.developpez.com

  3. #3
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    339
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 339
    Par défaut
    OK merci pour l'explication

    Donc si je ne dis pas de bétises, comme mon code n'est destiné qu'à tourner sur un linux, je me tournerais plus facilement vers la fonction read.

    Maintenant une dernière question qui me chagrine (je sais j'ai un peu de mal avec le C et toutes ces librairies ) :
    fread: préférable si le code est amené à voyager
    Je suppose que tu parles là de l'OS et non de l'architecture. Donc ma question va semblait bête mais est-ce que je peux utiliser la norme posix.1 sur n'importe quelle architecteur (x86, powerpc, arm, mips .....) ou suis-je obligé d'utiliser fread ??? (j'espère que j'ai été clair ...)

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Au passage: Dans les deux cas, bien préciser dans le open et le fopen que des données BINAIRES vont être lues: Les fichiers sont ouverts en mode texte par défaut, et le mode texte ne lit pas exactement le contenun du fichier (entre autres, il y a des magouilles au niveau des fins de ligne...)

    De plus, le open est moins portable que fopen , car le troisième paramètre (les droits d'accès) diffèrent selon les systèmes. (Sous DOS, c'était S_IREAD (présent même si on ne le mettait pas, DOS n'interdisant jamais la lecture) et S_IWRITE, tandis que sous unixoïde, c'est l'unique utilité des nombres en octal en C)
    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.

  5. #5
    Membre émérite
    Avatar de Pouic
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 669
    Par défaut
    Citation Envoyé par le mage tophinus
    Donc si je ne dis pas de bétises, comme mon code n'est destiné qu'à tourner sur un linux, je me tournerais plus facilement vers la fonction read.
    Ca depend :-)
    Si tu n'as pas besoin de faire d'opérations de contrôle ``fin'' sur ton descripteur de fichier, autant rester le plus portable possible.
    Si tu veux, l'idée est de ne _descendre_ de norme en norme que pour des besoins bien précis...
    Si ton code satisfait aux conditions d'utilisation en restant ANSI, tant mieux. Si, pour une raison ou une autre, la norme ANSI est trop stricte, et que ton programme a un champs d'application bien déterminé, on peux utiliser des fonctions Posix...
    Et si ça ne suffit toujours pas, on descend ainsi jusqu'aux fonctions spécifiques au système : et là, on perd toute portabilité (ce qui est fort dommage pour la réutilisation, par exemple ;-) )
    Maintenant une dernière question qui me chagrine (je sais j'ai un peu de mal avec le C et toutes ces librairies ) :
    fread: préférable si le code est amené à voyager
    Je suppose que tu parles là de l'OS et non de l'architecture. Donc ma question va semblait bête mais est-ce que je peux utiliser la norme posix.1 sur n'importe quelle architecteur (x86, powerpc, arm, mips .....) ou suis-je obligé d'utiliser fread ??? (j'espère que j'ai été clair ...)
    La norme, c'est ton environnement de développement qui doit te la garantir (que ce soit pour le developpement même ou pour la cible). L'intéret des normes (comme ANSI), c'est de faire abstraction de l'architecture courante : tu as accès à une certaine API, et tu as juste à savoir qu'elle remplit bien les fonctionnalités qu'elle prétend.
    Donc si ton environnement te garanti de respecter la norme Posix, tu peux utiliser l'API associée (rien à faire de l'architecture )
    Software becomes slower faster than hardware becomes faster
    [size=1]
    http://xrenault.developpez.com

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut Re: [linux] differences read & fread
    Citation Envoyé par le mage tophinus
    Voilà, je dois lire des données binaires dans un fichier et des des données "texte" dans un autre.

    binaire : fopen() avec "rb"
    texte : fopen() avec "r"

    Je suppose qu'il n'y a pas de problèmes si je choisis read ou fread. Mais alors pourquoi avoir deux fonctions différentes pour faire la même chose ???
    fread() : fonction standard du C pour les flux. (Usage recommandé)

    read() : fonction système. (standard POSIX.1) Il n'y a en principe aucune raison d'utiliser cette fonction. fread() suffit dans la plupart des cas.

  7. #7
    Membre éprouvé Avatar de kaisse
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    100
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 100
    Par défaut
    D'autre part considérer que son code "n'est destiné qu'à tourner sous Linux" n'est pas une raison valide. Il se peut que quelqu'un veuille porter ton code (ne serait-ce qu'un petit bout: un module, un fichier voire une fonction) sur une autre archi. Aussi, quand deux fonctions font la même chose, il est toujours préférable d'utiliser la plus portable.

    Personnellement, je n'utilise open/read/write à la place de fopen/fread/fwrite que lors de la manipulation de socket (quoique j'utilise la plupart du temps des bibliothèques qui encapsulent ces fonctions, comme SDL_net).

  8. #8
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    339
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 339
    Par défaut
    Merci à tous de vos réponses. J'avais pas vu du tout le problème sous ces angles. Et c'est vrai qu'il vaut mieux être le plus portable aussi. Alors voilà une question subsidiaire :
    Pour info je développe en ncurses (pour avoir une interface graphique console), mais comment savoir si ncurses est portable ? J'ai cru lire (mais je peux me tromper) que certaines fonctions étaient portables et d'autres non...


    Au passage: Dans les deux cas, bien préciser dans le open et le fopen que des données BINAIRES vont être lues: Les fichiers sont ouverts en mode texte par défaut

    binaire : fopen() avec "rb"
    texte : fopen() avec "r"
    Merci pour l'info, j'aurais encore cherché des heures pour trouver mon erreur

    PS : Question subsidiaire de subsidiaire : Je sais pas si ça a rapport mais ça fait bien longtemps que je me pose la question : Quelle est la différence entre GlibC et uClibc ???? Est-ce que ce sont des bilibothèques systèmes ? des normes POSIX ??? (Sachant que j'espèrerais que mon code soit aussi compilable avec uclibc et c'est même ma deuxième priorité après l'indépendance à l'architecture mais on peut toujours rêvé )

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par le mage tophinus
    Pour info je développe en ncurses (pour avoir une interface graphique console), mais comment savoir si ncurses est portable ? J'ai cru lire (mais je peux me tromper) que certaines fonctions étaient portables et d'autres non...
    En lisant la doc de cette bibliothèque. Si il existe des portages pour différentes cibles, ce sera indiqué.
    PS : Question subsidiaire de subsidiaire : Je sais pas si ça a rapport mais ça fait bien longtemps que je me pose la question : Quelle est la différence entre GlibC et uClibc ????
    Connait pas. Qu'en pense Google ?
    Est-ce que ce sont des bilibothèques systèmes ? des normes POSIX ??? (Sachant que j'espèrerais que mon code soit aussi compilable avec uclibc et c'est même ma deuxième priorité après l'indépendance à l'architecture mais on peut toujours rêvé )
    Pour être très portable, il faut se limiter à la norme.

    Néanmoins, on peut utiliser des extensions, en vérifiant leur portablilité.

    POSIX.1 est une norme qui spécifie l'API des fonctions systèmes. Elle est très répandue dans le monde unixoide (System 5, BSD, Linux...), un peu moins dans le monde Windows, mais on trouve quand même certaines fonctions interessantes (opendir(), readdir(), ou les pthreads, par exemple).

    On la trouve aussi parfois dans les bibliothèques C pour code embarqué.

    Ensuite il y a un tas de bibliothèques tierces plus ou moins portables et plus ou moins indépendantes...

    Par exemple, la plupart des systèmes qui supportent gcc peuvent avoir une extension glib, qui ouvre sur un tas de fonctions portables, allant jusquà un mécanisme complet de gestion d'interface graphique (GUI) portable (GTK+).

  10. #10
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    339
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 339
    Par défaut
    OK. Je commence à mieux comprendre maintenant. En gros, pour savoir si c'est portable, vaut mieux lire la doc. Mais comment savoir s'il n'existe pas une fonction plus portable que celle que j'allais utiliser ? Je prends par exemple la fonction read. J'allais l'utiliser mais disons que j'ai eu de la chance et que j'ai découvert fread qui est beaucoup plus portable mais si je ne ne connaissais par fread, y'a-t-il un moyen de découvrir qu'une telle fonction existe ??? Ou faut-il connaître les biblitohèques par coeur ??? Ou alors, est-ce qu'il faut rechercher d'abord dans ANSI puis POSIX ??? En gros, ce que je recherche c'est un peu une méthodologie de choix pour les fonctions et les bibliothèques.

    PS : Question subsidiaire de subsidiaire : Je sais pas si ça a rapport mais ça fait bien longtemps que je me pose la question : Quelle est la différence entre GlibC et uClibc ????

    Connait pas. Qu'en pense Google ?
    En fait, le web me donne pas beaucoup plus d'informations dessus que je ne savais déjà. En gros uclibc est une bibliothèque qui se veut beaucoup plus légère que glibc mais qui essaye d'avoir les mêmes fonctions. Et c'est là mon problème à mon avis : Qu'est-ce que glibc ??? la bibliothèque de gcc je suppose mais elle contient quoi ??? C'est quoi le rapport entre glibc et ANSI ou glibc et POSIX ???

    Et merci encore d'avance pour cet aide précieuse

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par le mage tophinus
    En gros, pour savoir si c'est portable, vaut mieux lire la doc.
    Oui. Si elle est bien faite, la portabilité est indiquée. Je pense que maintenant que tu es sensibilisé au problème, tu vas mieux voir les indications de portabilité dans les docs (man...). C'est vrai qu'on a un peu tendance à ignorer ce qui nous parait sans intérêt.
    Mais comment savoir s'il n'existe pas une fonction plus portable que celle que j'allais utiliser ?
    Si tu programmes en C, tu es censé connaitre les fonctions standards du C, ou au moins un moyen de les retrouver comme

    http://www-ccs.ucsd.edu/c/

    telle qu'elle est indiquée sur mon site (ma signature).

    Ou alors, est-ce qu'il faut rechercher d'abord dans ANSI puis POSIX ???
    Oui.

    http://emmanuel-delahaye.developpez.com/notes.htm#posix
    Qu'est-ce que glibc ??? la bibliothèque de gcc je suppose mais elle contient quoi ???
    http://www.gnu.org/software/libc/manual/html_node/index.html

  12. #12
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    339
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 339
    Par défaut
    Waouh, y'a de la lecture mais au moins je vais avoir maintenant de bonnes bases sur lesquelles commencer.

    Et Merci encore

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

Discussions similaires

  1. [Système][Appel system linux]Différence dossier /link
    Par busta28 dans le forum Général Java
    Réponses: 5
    Dernier message: 16/04/2005, 22h00
  2. 2 systeme linux identique sur 2 hd differents
    Par tomnie dans le forum Administration système
    Réponses: 17
    Dernier message: 30/03/2004, 11h17

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