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 :

Copie fichier à partir du clavier


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2012
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme

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

    Informations forums :
    Inscription : Octobre 2012
    Messages : 90
    Par défaut Copie fichier à partir du clavier
    Bonjour
    je demande votre aide sur un petit exercice :je dois écrire un programme en C qui copie le contenu entré par clavier sur un fichier passé en argument
    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
     
    # include<unistd.h>
    # include<fcntl.h>
    # define taille 80
    int main( )
    {
    int fd,nbcar;
    char buf[taille] ;
    // création du fichier
    fd = open ( " f i c h i e r " , O_CREAT| O _ WRONLY ) ;
    }
    // copier les donnes introduites à partir
    //du clavier dans le fichier
    while((nbcar=read(0,buf,taille))>0)
    if (write( f d , buf , nbcar)==-1) 
    return -1 ;
    return 0 ;
    }
    le problème c'est que quand je tape des lettres puis j'appuie sur entrer un fichier est créé mais ce fichier est vide puisque ça n'affiche rien quand je fais cat nomfichier. Merci

  2. #2
    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
    Pourquoi utiliser les fonctions POSIX de bas niveau au lieu des fonctions standard? Epit(a|ech)?

    Fais gaffe aussi, en création il faut passer un troisième paramètre à open(). Et il manque la fermeture propre du fichier. Aussi, utilise STDIN_FILENO au lieu du nombre magique 0.
    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.

  3. #3
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2012
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme

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

    Informations forums :
    Inscription : Octobre 2012
    Messages : 90
    Par défaut
    En fait l'exercice demande de ne pas utiliser les fonction de la bibliothèque standard de plus même quand je fait close() ça marche pas encore!

  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 : 36
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Par défaut
    La version naïve (déconseillée en cas de re-écriture de fichier car trop d'IO) :

    Ouvrir le fichier en ecriture, o_creat, et peut être écrasement (à voir selon le sujet)
    Lire 1 caractère sur STDIN_FILENO, tant que read renvoie 1...
    Ecrire 1 caractère dans le fichier
    Fermer le fichier

    Ta machine ne serait pas très contente si tu fais des reads de 1 pour recopier des fichiers, mais comme tu ne tapes probablement pas aussi vite (en espérant qu'il n'y ait pas de copier/coller de gros textes), c'est la méthode "minimale"/naïve.
    --
    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
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par felix01 Voir le message
    En fait l'exercice demande de ne pas utiliser les fonction de la bibliothèque standard de plus même quand je fait close() ça marche pas encore!
    Tu diras à ton prof que c'est débile. Tu lui demanderas aussi pourquoi est-ce que pour lui open() n'est pas une fonction standard ?



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fd = open ( " f i c h i e r " , O_CREAT| O _ WRONLY ) ;
    Allo ? T'es sous Unix et tu mets des espaces à gogo dans tes noms de fichiers ? Ché pas, vous me recevez ? :O Plus sérieusement, évite les espaces, pour le bien de tous et surtout le tien

    Pourquoi y a t-il une accolade à la ligne 11 ? Pour plus de lisibilité et de facilité de maintenabilité, je te conseille de mettre des accolades avec tes while et tes if. Tu visualiseras mieux qui est dans quel bloc et tu aurais peu de risques d'erreurs en cas de rajout d'instruction dans l'une des structures de contrôles.

  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 : 36
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Par défaut
    Pour le C/UNIX (et je précise bien le C/UNIX, pas le C tout court), il arrive que les écoles forcent à utiliser les syscalls de l'OS, et uniquement ceux-ci (et c'est en effet le cas dans les Epit* durant les 1eres années)
    L'une des justifications est qu'il faut savoir ce qu'il se passe dans la lib standard, juste au dessus des syscalls, pour pouvoir mieux la manipuler.
    Et aussi de comprendre quelles sont les interfaces de communication d'UNIX : open, read, write, close... et on peut parler avec tous les devices... plutôt simple donc... (sans rentrer dans les détails avec sysctl et tout...)

    Je ne dirai pas si c'est positif ou non... mon avis est biaisé de base


    Mais ça ne change pas la remarque de Bktero sur les espaces !
    (D'ailleurs, Bktero, tu n'as pas vu le post hier soir quand il y avait des espaces quasiment partout dans le code.... pas de "if ..." mais "i f . . .")
    --
    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
    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
    Citation Envoyé par Bktero Voir le message
    Tu lui demanderas aussi pourquoi est-ce que pour lui open() n'est pas une fonction standard ?
    Ce n'en est pas une pour moi non plus. Ou du moins, ce n'est pas une fonction standard C. C'est une fonction POSIX.
    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
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Ce n'en est pas une pour moi non plus. Ou du moins, ce n'est pas une fonction standard C. C'est une fonction POSIX.
    Je pense que ça joue sur cette distinction. Mais bon.... La norme C est un standard. POSIX est un autre standard. Bref, je trouve ça bête de débuter en C et de ne pas utiliser les fonctions de la norme pour préférer les fonctions de l'OS.

    Pour le C/UNIX (et je précise bien le C/UNIX, pas le C tout court), il arrive que les écoles forcent à utiliser les syscalls de l'OS, et uniquement ceux-ci (et c'est en effet le cas dans les Epit* durant les 1eres années)
    L'une des justifications est qu'il faut savoir ce qu'il se passe dans la lib standard, juste au dessus des syscalls, pour pouvoir mieux la manipuler.
    Et aussi de comprendre quelles sont les interfaces de communication d'UNIX : open, read, write, close... et on peut parler avec tous les devices... plutôt simple donc... (sans rentrer dans les détails avec sysctl et tout...)
    Je comprends l'intérêt mais justement quand on n'est plus totalement débutant et qu'on commence à comprendre les mécanismes. On peut alors s'attaquer à ce qu'il y a "sous le capot" et descendre au niveau OS.

    Pour compléter ma première phrase de ce message, utiliser les fonctions POSIX et non ISO C revient à donner un cours de C / POSIX et non un cours de C.

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

Discussions similaires

  1. Copie d'un fichier à partir d'un disque réseau
    Par Guiz721 dans le forum VBScript
    Réponses: 0
    Dernier message: 20/01/2012, 13h10
  2. [Batch] Copie fichier à partir ftp
    Par odammas36 dans le forum Scripts/Batch
    Réponses: 3
    Dernier message: 21/06/2011, 23h26
  3. Copie de fichier à partir d'une liste
    Par curt dans le forum VBA Access
    Réponses: 14
    Dernier message: 09/07/2008, 14h00
  4. copie de fichier à partir d'une clé usb
    Par aklabig dans le forum Applications et environnements graphiques
    Réponses: 4
    Dernier message: 24/09/2007, 14h58
  5. copie de fichier à partir d'une url
    Par Gibbon dans le forum C#
    Réponses: 4
    Dernier message: 06/02/2007, 14h13

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