Bonjour,
Je dois faire un "petit" programme qui simule la fonction copy du DOS. Seulement, j'ai un petit problème avec la commande putc (le prof veut qu'on utilise exclusivement putc et getc pour la lecture/écriture). Voici le bout de code qui fait le travail :
Le code complet ainsi qu'une trace d'exécution se trouve dans cette archive :
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 printf("BEGIN => We are at octet %d\n", ftell(dst)); while(!feof(src)) { ch = getc(src); printf("%c", putc(ch, dst)); // printf("%c", ch); } printf("\nEND => We are at octet %d\n", ftell(dst)); printf("\n\nOperation terminated \n"); fclose(src); fclose(dst);
=> http://gtemgoua.developpez.com/tmp/CopyFile.zip
(code source + trace d'exécution + fichier help.txt + .exe)
Le fichier help.txt contient la description des paramètres d'appels.
En gros, on utilise la fonction pour copier un fichier vers une destination, et avec l'argument -a on peut ajouter le fichier source à la fin du fichier destination. Au premier appel (le fichier destination n'existe pas), tout se passe bien :
J'écrit sur la console la position du pointeur dans le fichier.BEGIN => We are at octet 0
#include <io.h>
#include <stdio.h>
#include <conio.h>
#include <dir.h>
#include <dirent.h>
#include <string.h>
#include <sys\stat.h>
#include <fcntl.h>*
END => We are at octet 159
Au second appel, "pareil" :
sauf que dans ce cas, RIEN du tout n'est écrit dans le fichier, pourtant on voit bien que la position du pointeur dans le fichier a changé !!!! Mais sur la console, le contenu du fichier source est bien écrit !BEGIN => We are at octet 159
#include <io.h>
#include <stdio.h>
#include <conio.h>
#include <dir.h>
#include <dirent.h>
#include <string.h>
#include <sys\stat.h>
#include <fcntl.h>*
END => We are at octet 318
Pour ceux qui n'ont pas le temps de regarder l'archive, voici comment j'associe le flux au handle du fichier (d'après l'aide, un flux associé de cette façon peut être utilisé en lecture comme en écriture) :
OpenMode est définit plus haut par :
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 int handle = open(DestPath, OpenMode, S_IREAD | S_IWRITE); if(handle == -1) { perror("Error : "); return; } if(strcmpi(FileMode,"a") == 0) { if(lseek(handle, filelength(handle), SEEK_SET) == -1L) perror("Seek : "); printf("\nseeking...\n"); } FILE* dst = fdopen(handle, FileMode);
où FileMode désigne le mode d'ouverture passé en paramètre à la fonction qui fait la copie.
Code : Sélectionner tout - Visualiser dans une fenêtre à part int OpenMode = (strcmp(FileMode, "a") == 0)?O_CREAT | O_APPEND:O_CREAT;
Pourrais-t-on m'expliquer pourquoi l'appel à putc écrit bien sur la console mais pas dans le fichier ?
Merci.
Partager