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 :

cat => passer de fgetc à read


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 9
    Par défaut cat => passer de fgetc à read
    Bonsoir,
    Je suis en train de travailler sur mon my_cat.
    J'avais finis, tout fonctionnait, sauf qu il y a eu un petit changement : tout ce qui est fopen fgetc, ... INTERDIT.
    J'ai donc réhabilité le code avec du open et du read.
    Sauf que le comportement normal fonctionne mais plus aucune de mes options ne fonctionnent et je n'arrive pas à voir pourquoi. Sachant que mes conditions se font suivant le \n.
    les changements intervenants que sur une partie, je vous montre donc que cette partie. les paramètres en entrée sont donc un tableau d'option puis le nom d un fichier.

    Voilà la partie du code avant modification et donc fonctionnel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
    code retiré pour éviter la copie de mes camarades de promo ^^"
    Mais si vous êtes confrontez à cet échange n'hésitez pas a me contacter.

    Et voici le code après modification :


    Merci à tous ceux qui tenteront de m'aider =)

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 767
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 767
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par OSNLC Voir le message
    Merci à tous ceux qui tenteront de m'aider =)
    Salut
    T'as juste oublié qu'en C, un tableau commence à 0 et non à 1. Toutefois je me demande pourquoi tu utilises un tableau pour travailler sur un caractère.
    Accessoirement mettre le mode 0666 dans open ne se justifie que si le fichier est créé à l'ouverture.

    Code c : 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
    // my_cat.c
     
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
     
     
    #define SZ_BUFFER     1000
    int main(int argc, char *argv[])
    {
        int f;
        char buffer[SZ_BUFFER];
        int nb;
     
        f=open(argv[1], O_RDONLY);
     
        while ((nb=read(f, buffer, SZ_BUFFER)) > 0)
            write(1, buffer, nb);
        close(f);
    }
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Février 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 9
    Par défaut
    Ah oui en effet erreur très bête de ma part ^^" J'ai honte de moi.
    il me semble que c'est parce que la fonction retourne un tableau, donc même si je lui dis de récupérer 1 caractère par 1, lui il stock dans un tableau. Ce qui me force a travailler sur un tableau de 1 caractère.
    après il est possible que ma compréhension de la chose n'est pas été optimisée lorsque j'ai travaillé dessus.



    Je vais rectifier tout ça.

    Serait - il possible d'éditer ton commentaire afin de retirer mon code s'il te plait ?
    étant donné que je suis dans une école très stricte au niveau de la copie,
    je voudrais éviter que l'un de mes camarades passe par là et le copie.

    Merci beaucoup !

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 767
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 767
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par OSNLC Voir le message
    Ah oui en effet erreur très bête de ma part ^^" J'ai honte de moi.
    il me semble que c'est parce que la fonction retourne un tableau, donc même si je lui dis de récupérer 1 caractère par 1, lui il stock dans un tableau. Ce qui me force a travailler sur un tableau de 1 caractère.
    après il est possible que ma compréhension de la chose n'est pas été optimisée lorsque j'ai travaillé dessus.
    En effet. La fonction read ne retourne pas de tableau mais le nombre d'octets réellement lus. Et elle prend en paramètre l'adresse d'une zone où stocker les octets lus. Mais rien n'oblige cette zone à être un tableau...
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char c;
    read(f, &c, sizeof char);   // L'adresse de c c'est bien une adresse non ???

    Citation Envoyé par OSNLC Voir le message
    Serait - il possible d'éditer ton commentaire afin de retirer mon code s'il te plait ?
    étant donné que je suis dans une école très stricte au niveau de la copie,
    je voudrais éviter que l'un de mes camarades passe par là et le copie.

    Merci beaucoup !
    C'est fait.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Février 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 9
    Par défaut
    En effet oui !

    Ce que je trouve bizarre c'est que donc pour le read je le mets en chemin &c,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    read(fichier, &c, sizeof(char));
    je le mets aussi sur le write sinon il m’envoie chier.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    write(STDOUT_FILENO, &c, nbread);
    Mais dans les comparaisons pour les options pas besoin de le mettre il le prend quand même. exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (c == '\n' && opt[1] == 'e')

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 767
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 767
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par OSNLC Voir le message
    Ce que je trouve bizarre c'est que donc pour le read je le mets en chemin &c,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    read(fichier, &c, sizeof(char));
    je le mets aussi sur le write sinon il m’envoie chier.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    write(STDOUT_FILENO, &c, nbread);
    Bien évidemment. read() et write() sont faits pour travailler sur des tableaux d'octets. Or, en c, un tableau se référence toujours par une adresse (l'adresse de son premier caractère).
    Donc si tu as char tab[10] et char b, alors tab[0] et b sont tous deux un caractère. Et &tab[0] et &b référencent chacun l'adresse de ce caractère.
    Sauf que si tu as un tableau tab, tu as le droit de le référencer via &tab[0] ou bien juste par son nom tab ce qui est la même chose.

    Et bien entendu quand tu as un seul caractère à gérer, pas besoin de passer via un tableau. Sauf qu'il faut quand-même que read() et write() reçoivent une adresse donc tu leur passes l'adresse de ce caractère...

    Citation Envoyé par OSNLC Voir le message
    Mais dans les comparaisons pour les options pas besoin de le mettre il le prend quand même. exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (c == '\n' && opt[1] == 'e')
    Là aussi c'est évident. L'opérateur == compare des valeurs simples et n'est pas prévu pour recevoir des adresses à comparer (tu peux lui passer bien évidemment des adresses mais il les considèrera comme de simples nombres). Et donc ce n'est pas "pas besoin" qu'il faut dire mais "surtout pas".

    Tu devrais revoir le cours sur les pointeurs, les adresses et les tableaux...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Février 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 9
    Par défaut
    Merci pour ces explications.
    Désolé là où je suis nous n'avons pas vraiment de cours ^^"

    Mais je viens de trouver ici les cours de C et la FAQ C

Discussions similaires

  1. BindingSource : passer les composants IHM liés en read only
    Par yan_064 dans le forum Framework .NET
    Réponses: 2
    Dernier message: 21/08/2007, 15h39
  2. Passer du Pascal à Delphi
    Par poppels dans le forum Langage
    Réponses: 7
    Dernier message: 30/08/2002, 22h07
  3. [controle] propriété read only
    Par Fizgig dans le forum Composants VCL
    Réponses: 6
    Dernier message: 28/08/2002, 11h30
  4. CheckBox en Read Only
    Par MrJéjé dans le forum C++Builder
    Réponses: 7
    Dernier message: 23/06/2002, 16h00
  5. Passer en mode 800*600
    Par flavien tetart dans le forum Assembleur
    Réponses: 8
    Dernier message: 31/05/2002, 00h05

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