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 : 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);
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 :

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" :

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 : 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);
OpenMode est définit plus haut par :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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.