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 :

transfert de caractere.


Sujet :

C

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 560
    Points : 71
    Points
    71
    Par défaut transfert de caractere.
    Bonjour,
    je voudrais faire un programme en C qui lit ce qu'il y a dans un fichier txt et l'envoie dans un autre fichier txt.Voici le 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
    20
    21
    #include <stdio.h>
    #include <stdlib.h>
     
    int main()
    {
    	char c;
    	int old0,old1;
    	old0=dup(0);
    	old1=dup(1);
    	close(0);
    	int v = open("/home/toto/Bureau/text.txt", "r");
    	dup(v);
    	close(1);
    	int w = open("/home/toto/text2.txt","rwx");
    	dup(w);
    	while((c=getchar()) != EOF )
    	{
    		putchar(c);
    	}
    	return 0;
    }

    Je ne comprend pas pourquoi le programme ne fonctionne pas.
    Si quelqu'un pouvait m'aider .D'avance merci.

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,

    Ce code fait exactement ce qu'on lui demande :
    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
    22
    23
    24
    #include <stdio.h>
    #include <stdlib.h>
     
    int main()
    {
        char c;
        int old0, old1;
        old0 = dup(0);
        old1 = dup(1);
        /* fermeture de stdin */
        close(0);
        int v = open("/home/birdy/Bureau/text.txt", "r");
        dup(v);
        /* fermeture de stdout */
        close(1);
        int w = open("/home/birdy/text2.txt", "rwx");
        dup(w);
     
        /* le permier appel a getchar renvoi EOF puisse que stdin est fermé */
        while ((c = getchar()) != EOF) {
            putchar(c);
        }
        return 0;
    }
    On peut lire un fichier ouvert avec open avec read(int fd, void *buf, size_t count).

    Pour lire un fichier caractère par caractère, on peut aussi utiliser fgetc(FILE * stream), mais dans ce cas, le fichier doit être ouvert avec fopen (et fermé avec fclose).

    Sinon, voir aussi : Comment copier un fichier (ISO) ?.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 560
    Points : 71
    Points
    71
    Par défaut RE
    merci de ta reponse.Mais en fait le programme ne fonctionne pas comme je le souhaiterai.Dans le fichier dans lequel j'ecris ,il n'y a rien de marqué.

  4. #4
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par bird12358 Voir le message
    merci de ta reponse.Mais en fait le programme ne fonctionne pas comme je le souhaiterai.Dans le fichier dans lequel j'ecris ,il n'y a rien de marqué.
    J'ai dit que le programme faisait ce qu'on lui demandait, pas ce que tu voulais, regarde mes commentaires dans ton codes : tu essayes de lire depuis stdin (l'entrée standard) vers stdout (la sortie standard) alors que tu viens de les fermer...

    getchar : lecture d'un char depuis stdin
    putchar : écriture d'un char dans stdout

    Et pour reprendre un citation anonyme : L'ordinateur obéit à vos ordres, pas à vos intentions.
    Dernière modification par Invité(e) ; 28/08/2008 à 07h36.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 560
    Points : 71
    Points
    71
    Par défaut RE
    Heu d'accord interessant ce cours sur la definition des mots mais ca me fait pas avancer d'un poil lol .
    En fait elles sont reouvertes avec dup(w) ?non ??
    Par contre qd je ne change pas la stdout le message qui est dans le texte1 s'affiche bien a l'ecran.C'est quand je fais intervenir la 2ieme sortis que ca me donne rien.Peutetre faut-il inclure une bibliotheque particuliaire...

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 15
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par bird12358 Voir le message
    En fait elles sont reouvertes avec dup(w) ?non ??
    Par contre qd je ne change pas la stdout le message qui est dans le texte1 s'affiche bien a l'ecran.C'est quand je fais intervenir la 2ieme sortis que ca me donne rien.Peutetre faut-il inclure une bibliotheque particuliaire...
    1) dup duplique et c'est tout donc dup(w) tous seul ne sert a rien
    2) c'est normal que rien ne s'affiche puisque tu écrit sur un descripteur de fichier clos. Teste le retour de putchar normalement tu auras une erreur. De plus tu ne retablie pas les std a la fin ... c'est gore
    3) tu utilise des fonctions compliques pour faire quelquechose de simple. Ce serait beaucoup plus simple de faire 2 open et un :
    while (read ... != 0)
    {
    write (...)
    }
    ca prends moins de ligne, c'est plus rapide et tu ne change pas les std

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 560
    Points : 71
    Points
    71
    Par défaut RE
    Ba en fait je ne sais pas comment utiliser le write et le read ,moi je les utilisais quand je faisais des tubes et que j'envoyais des données une a une mais la je vois pas comment l'utiliser .
    Deuxiement je croyais que je fais de faire close(0) et dup (v) ca renplacé l'entrée std par v ?Comment je peux faire si je veux continuer dans le changement d'entrée et de sortie standart.

  8. #8
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Août 2008
    Messages
    28
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2008
    Messages : 28
    Points : 37
    Points
    37
    Par défaut
    tu aurais pu faire ça:
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    #include <stdio.h>
    #include <stdlib.h>
    /* inclusion des unités */
    int main() /* Fonction principale du programme */
    {
         char car;
         FILE *Source = NULL; /* pointeur vers le fichier source */
         FILE *Destination = NULL; /* pointeur vers le fichier destination */
         Source = fopen(FichierSource , "r"); /* FichierSource indique l'emplacement du fichier source */
         Destination = fopen(FichierDestination , "w"); /* FichierDestination indique l'emplacement du fichier destination (répèrtoire de création)*/
         if(Source == NULL || Destination == NULL) /* routine d'érreure */
               {
                     if(Source != NULL)
                          fclose(Source);
                     if(Destination != NULL)
                          fclose(Destination);
                     printf("L'opération n'a pas aboutit car une erreure s'est produite lors de l'ouverture d'un fichier");
                     system("PAUSE");
                     return EXIT_FAILDE;
               }
         else
              {
                    while(!feof(Source)) /* boucle du transfert */
                          {
                               fread(&c , sizeof(char) , 1 , Source);
                               fwrite(&c , sizeof(char) , 1 , Destination);
                          }
                    fclose(Source); /* ferméture dés fichiers */
                    fclose(Destination);
                    printf("Transfert effectué avec succes\n");
                    system("PAUSE"); /* figer le programme */
                    return EXIT_SUCCESS; /* programme terminer avec succes */
              }
     
    }
    Il existe des lignes facultatives, par exemple : la fonction system("PAUSE"); vus que le programme retourne un résultat sur le disque dur on est pas obligé de figer le programme.
    Merci.... à+

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 560
    Points : 71
    Points
    71
    Par défaut RE
    ok merci je vois c'est beaucoup plus simple comme tu l'ecris.

Discussions similaires

  1. éliminer un caractere d'un string
    Par no-vice dans le forum Langage
    Réponses: 5
    Dernier message: 09/08/2002, 14h55
  2. Problème de transfert FTP sous IIS
    Par thanathz dans le forum Développement
    Réponses: 2
    Dernier message: 12/07/2002, 15h27
  3. Réponses: 3
    Dernier message: 12/06/2002, 21h15
  4. Réponses: 2
    Dernier message: 29/05/2002, 20h43
  5. Probleme sur les chaines de caractere
    Par scorpiwolf dans le forum C
    Réponses: 8
    Dernier message: 06/05/2002, 19h01

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