Putc n'écrit pas dans le fichier ?
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 :
Code:
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); |
Le code complet ainsi qu'une trace d'exécution se trouve dans cette archive :
=> 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 :
Citation:
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
J'écrit sur la console la position du pointeur dans le fichier.
Au second appel, "pareil" :
Citation:
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
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 !
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) :
Code:
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); |
OpenMode est définit plus haut par :
Code:
int OpenMode = (strcmp(FileMode, "a") == 0)?O_CREAT | O_APPEND:O_CREAT;
où FileMode désigne le mode d'ouverture passé en paramètre à la fonction qui fait la copie.
Pourrais-t-on m'expliquer pourquoi l'appel à putc écrit bien sur la console mais pas dans le fichier ?
Merci.
Re: Putc n'écrit pas dans le fichier ?
Citation:
Envoyé par Giovanny Temgoua
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 :
Code:
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); |
feof() ne fait pas ce que tu crois (C != Pascal). Il faut tester le code retourné par la fonction de lecture :
http://emmanuel-delahaye.developpez....s.htm#fichiers
Pour ouvrir le fichier :
lecture binaire :
Code:
FILE *fp_src = fopen("source", "rb");
ecriture binaire
Code:
FILE *fp_des = = fopen("destination", "wb");