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 :

Copier le contenu d'un fichier


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Inscrit en
    Janvier 2008
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 1
    Par défaut Copier le contenu d'un fichier
    Salut à tous. Demain je passe un partiel de TP en langage C, mais j'ai quelques soucis avec les fichiers.
    Pour m'exercer, j'essaie de faire un exercice qui consiste à écrire dans un fichier "toto.txt", le contenu du fichier "tata.txt", mais seulement une lettre sur deux. Ensuite, je dois afficher le nombre de voyelles présentes dans le fichier "toto.txt" aprés l'étape d'écriture de une lettre sur 2.
    Pour la 1ère étape, je bloque pour l'écriture. Je commence par ouvrir en lecture le fichier "tata.txt" puis ensuite dans un "for", je compte le nombre de caractère présents dans le fichier. Je sais qu'ensuite il faut ouvrir en écriture le fichier "toto.txt" mais aprés je ne sais pas comment lui dire d'écrire 1 lettre sur 2.


    Voila le début de mon programme :

    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
    int main(void)
    {
    int i;
    char ch[100]={0},
     
    FILE*fichier
    fichier=fopen("tata.txt","r");
    if(fichier=!NULL)
    {
          while(fgets(ch,100,stdin),feof(fichier)==O)
          {i++;
          }
          fclose;
    }
    printf("Il y a %d mots dans votre fichier",i);
    FILE*fic
    fic=fopen("toto.txt","w");
    if(fic!=NULL)
    {
    Voila, à partir de là je bloque.
    Merci d'avance pour vos réponses.

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    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 397
    Par défaut
    Je pense que ce sera plus simple si tu y vas caractère par caractère au lieu de ligne par ligne: Utilise fgetc() et fputc().

    De plus, tu utilises mal feof() : Il ne faut pas appeler cette fonction tant qu'une autre fonction de lecture n'a pas échoué.
    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 confirmé
    Avatar de dj_benz
    Homme Profil pro
    Inscrit en
    Octobre 2002
    Messages
    178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Octobre 2002
    Messages : 178
    Par défaut
    Salut,
    Je ne vais critiquer la technique de réviser son partiel 12h avant, je faisais pareil....

    Dans ton for, il te faut:
    • pour écrire une lettre sur deux, tu mets un booléen qui s'inversera a chaque boucle, et qui n'écrira dans le fichier qu'une fois sur deux.
    • pour savoir si tu as une voyelle, tu es obligé de comparer le caractère courant avec les 5 voyelles, et tu incrémente un compteur si c'est le cas.


    Ensuite, tu affiches à l'écran ton compteur de voyelles, et tu refermes ton fichier texte.

    Je ne donne volontairement pas la solution, sinon, je t'aide pas à réviser!
    Bon courage.

    Benz

    PS: penses à ouvrir tes fichiers en tant que texte "r" et "w"

  4. #4
    Invité de passage
    Inscrit en
    Janvier 2008
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 1
    Par défaut Modulo
    Je suis d'accord qu'il vaut mieux utilier fgetc pour compter des caractères plutôt que fgets, mais pour compter une lettre sur deux, plutôt qu'une variable d'incrémentation i et un test (i%2 == 0) valent mieux qu'un booléen. Enfin, personnellement, et intuitivement, c'est ce que j'aurais fait.

  5. #5
    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 gabriel.r3g Voir le message
    Je suis d'accord qu'il vaut mieux utilier fgetc pour compter des caractères plutôt que fgets, mais pour compter une lettre sur deux, plutôt qu'une variable d'incrémentation i et un test (i%2 == 0) valent mieux qu'un booléen. Enfin, personnellement, et intuitivement, c'est ce que j'aurais fait.
    On ne peut pas affirmer quelle est la meilleure méthode et ça n'a pas vraiment d'importance. Si on y tient, on peu faire des mesures de taille de code ou de performance, mais le résultat n'est pas portable. Sel le comportement l'est.

    Nota : pour déterminer la parité, % 2 est un peu lourdingue (et probablement pas très efficace). Je me contente de tester le bit 0 : au cas où l'optimiseur ne trouverait pas la simplification tout seul...

  6. #6
    Membre confirmé
    Avatar de dj_benz
    Homme Profil pro
    Inscrit en
    Octobre 2002
    Messages
    178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Octobre 2002
    Messages : 178
    Par défaut
    Si on veut optimiser au maximum, le modulo n'est effectivement pas le plus approprié. L'incrémentation et le test du bit 0 est meilleure, mais j'aime bien ma solution:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    b = !b;
    if (b) { ... }
    qui, en assembleur, fait 2 instructions.
    Mais le problème ne porte pas sur la recherche de la nanoseconde d'exécution!

Discussions similaires

  1. Réponses: 4
    Dernier message: 28/08/2007, 17h11
  2. Copier le contenu d'un fichier distant dans une variable en local
    Par arnaudperfect dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 16/08/2007, 20h34
  3. Copier le contenu d'un fichier vers un autre fichier Excel
    Par mathias dans le forum VBA Access
    Réponses: 4
    Dernier message: 13/06/2007, 14h47
  4. Copier le contenu d'un fichier word
    Par MayOL69bg dans le forum C#
    Réponses: 7
    Dernier message: 04/06/2007, 16h34
  5. Copier le contenu d'un fichier dans un autre
    Par moncef357 dans le forum Pascal
    Réponses: 20
    Dernier message: 09/05/2007, 16h02

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