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 :

2 versions de myread


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 30
    Par défaut 2 versions de myread
    Bonjour,

    Le but étant d'écrire une fonction myread qui rappelle read juqu'à avoir lu en tout count caractères, ou avoir rencontré une erreur ou une fin de fichier

    Je vous propose 2 versions de myread qui compilent et qui font a priori le travail demandé :

    voici la première :

    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
    ssize_t myread (int fd, void *buf, size_t count) {
     
        ssize_t n;
        ssize_t res = count;
     
        while ((n = read (fd, buf, res)) > 0)
    	res -= n;
     
        if (n == -1) {
    	perror ("read");
    	exit (2);
        }
     
        return count - res;
    }
    et voila la seconde :

    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
    ssize_t myread (int fd, void *buf, size_t count) {
     
        ssize_t chars_read = 0;
        ssize_t result;
        char *s = buf;
     
        while (chars_read < count) {
     
    	result = read (fd, s, count - chars_read);
    	if (result == 0 || (result == -1 && chars_read > 0))
    	    return chars_read;
    	else if (result == -1)
    	    return -1;
    	else {
    	    chars_read += result;
    	    s += result;
    	}
        }
     
        return chars_read;
    }
    Je voudrais savoir laquelle des 2 versions est préférable et pourquoi ?

    merci d'avance

  2. #2
    Membre éprouvé
    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
    Par défaut
    la premiere version est nettement plus lisible.
    hormis un exit sauvage (en plus, une valeur non standard) et que tu oublie d'incrémenter buf. ça devrais aller
    aprés, quand à la fiabilitée du code ... je n'ai pas regardé assez en détail.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 30
    Par défaut
    Merci pour ta réponse Dark_Ebola

    voici la première version corrigée :

    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
    ssize_t myread (int fd, void *buf, size_t count) {
     
        ssize_t n;
        ssize_t res = count;
     
        while ((n = read (fd, buf, res)) > 0) {
    	res -= n;
    	buf += n;
        }
     
        if (n == -1 && res == count) 
            return -1;
     
        return count - res;
    }
    Aussi j'aurais voulu savoir quel est le mieux entre déclaré un nouveau pointeur s qui pointe sur buf tel que et ensuite faire les opérations sur s. OU bien agir directement sur buf comme dans l'exemple ci-dessus, car de toute façon l'incrémentation de buf ne fait qu'incrémenter la copie du pointeur locale à myread ?

    Merci à vous !

  4. #4
    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 DiabolO Voir le message
    Aussi j'aurais voulu savoir quel est le mieux entre déclaré un nouveau pointeur s qui pointe sur buf tel que et ensuite faire les opérations sur s. OU bien agir directement sur buf comme dans l'exemple ci-dessus, car de toute façon l'incrémentation de buf ne fait qu'incrémenter la copie du pointeur locale à myread ?
    Si tu n'as plus besoin de la valeur originelle de buf dans la fonction, tu peux la modifier comme ici. Sinon, oui, il faut un pointeur intermédiaire.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 30
    Par défaut
    Si tu n'as plus besoin de la valeur originelle de buf dans la fonction
    Merci c'est tout ce que je voulais savoir

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

Discussions similaires

  1. [Kylix] [Kylix 3] Installation version Open
    Par muadib dans le forum EDI
    Réponses: 1
    Dernier message: 14/03/2003, 16h37
  2. [SYBASE] Versions de Sybase
    Par ora9i dans le forum Sybase
    Réponses: 5
    Dernier message: 25/10/2002, 12h22
  3. [Kylix] cours & version utilisable de Kylix
    Par Suricate dans le forum EDI
    Réponses: 1
    Dernier message: 19/09/2002, 18h22
  4. Version étudiant de Delphi 6
    Par Smortex dans le forum EDI
    Réponses: 2
    Dernier message: 20/07/2002, 11h13

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