Citation
oliv
qui a pour but de copier un fichier, marche tres bien sous linux (mdk 9.1) mais une fois compilé sous windows via lcc-win32, je parviens à copier un fichier, seulement lorsque je veux ouvrir la copie je resois un message d'erreur. Et au final ne ne peux acceder à ce nouveau fichier.
Je ne comprend pas où est l'erreur ou le probleme.
Olivier
Bon, déjà partout où il y a écrit "&source" faut enlever le "&". La variable "source" étant déjà une adresse. Je suis d'ailleurs étonné que tu dises "marche très bien" (à moins que tu considères les warning comme négligeable mais après faut pas t'étonner si ça n'est pas portable...).
Ensuite, si ta structure "info_fichier" (tiens? j'aurais dû mettre un copyright sur ce nom de variable comme le font certains américains sur le "for (i=0; i < n; i++)") ne sert que pour avoir une condition d'arrêt de lecture, c'est inutile. Les fonctions de lecture comme "fgetc()" savent détecter la fin de fichier et renvoient dans ce cas une valeur particulière.
Il suffit de faire un "while ((c=fgetc(fichier1) != EOF)"
De plus, les fonctions "getc()" et "putc()" sont des macro. Personnellement, je préfère utiliser les vrai fonctions "fgetc()" et "fputc()" parce que j'ai horreur de me servir d'une macro écrite en minuscule (si on ne sait pas qu'il s'agit d'une macro, on peut l'utiliser avec un paramètre style "i++" et générer des effets de bords). Bon, ça c'est perso...
Enfin sous Windows il faut rajouter l'option "b" dans le second paramètre de "fopen()" indiquant qu'on veut traiter le fichier de façon "brute" ou "binaire"
Donc => fichier1=fopen(source, "rb") et fichier2=fopen("image", "wb")
PS: C'est super de traiter le cas ou on n'arrive pas à ouvrir "source". Mais si on est cohérent avec soi-même, il faut aussi traiter le cs où on n'arrive pas à ouvrir "image"
PS2:
Citation
printf("Copie en cours...\n"); /*message ecran*/
Au-moins t'as un super réflexe de mettre des commentaires (tous ne le font pas). Maintenant, essaye d'apprendre à mettre des commentaires plus... pertinents
Bon, si on corrige ton code avec tous ces détails, voici un truc qui devrait mieux fonctionner (non testé car là, je suis chez-moi et j'ai pas de compilo) :
Citation
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main(void)
{
____/* DECLARATION DES VARIABLES */
____FILE *fichier1; /* Fichier entrée */
____FILE *fichier2; /* Fichier sortie */
____char c; /* Caractère lu
____char fsource[91]; /* Nom du fichier source */
____size_t nb_octet; /* Compteur d'octets */
____/* Saisie du nom du fichier à copier */
____printf("saisir fichier source: ");
____fflush(stdout); /* Affiche le message immédiatement */
____scanf("%s",fsource);
____/* Ouverture du fichier source avec contrôle réussite fopen */
____fichier1=fopen(fsource,"rb");
____if (fichier1 == NULL)
____{
________printf("Une erreur c'est produite lors de la tentative d'ouverture du fichier: %s\n",fsource);
________return(-1);
____}
____/* Ouverture du fichier cible avec contrôle réussite fopen */
____fichier2=fopen("image","wb");
____if (fichier2 == NULL)
____{
________fclose(fichier); /* Hé oui, il faut penser à défaire ce qui a été fait... */
________printf("Une erreur c'est produite lors de la tentative d'ouverture du fichier image\n");
________return(-1);
____}
____/* Boucle de lecture */
____printf("Copie en cours...\n");
____nb_octet=0;
____while((c=fgetc(fichier) != EOF)
____{
________/* Ecriture de l`octet lu dans le fichier cible */
________fputc(c,fichier2);
________/* Incrément compteur d'octets */
________++nb_octet;
____}
____/* Fermeture des fichiers */
____fclose(fichier1);
____fclose(fichier2);
____printf("C'est fini !\n");
____printf("Nombre total d'octet transfere: %lu\n", nb_octet);
}
L'homme qui murmurait à l'oreille des pingouins
[
fr.lang.free.fr]