Léa-Linux & amis :   LinuxFR   GCU-Squad   GNU
programme en C sous windows
Envoyé par: oliv

Salut a tous

Mon petit programme est le suivant,

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

int main(void)
{
/*DECLARATIONM DES VARIABLES*/
FILE *fichier1,*fichier2;
char c;
char fsource[91]; /*determination du fichier source-ne peut exceder 90 caracteres*/
int increment;
struct stat info_fichier; /*variable buffer pour la fonction stat*/
/*-------------------------*/


/*DEBUT CORP PROGRAMME*/

printf("saisir fichier source: "); /*message ecran*/
scanf("%s",&fsource); /*saisie du fichier source*/

increment=0; /*initialisation de la variable d`increment*/
fichier1 = fopen(fsource,"r"); /*declaration du fichier source*/

if (fichier1==NULL) /*teste sur l'existante du fichier source*/
{
printf("Une erreur c'est produite lors de la tentative d'ouverture du fichier: %s\n",&fsource);
}
else
{
fichier2 = fopen("image","w"); /*declaration du fichier cible*/
stat(fsource,&info_fichier); /*chargement dans le buffer des paremttres du fichier designé par fsource*/

printf("Copie en cours...\n"); /*message ecran*/
while(increment<info_fichier.st_size) /*boucle de traitement*/
{
c=(char)getc(fichier1); /*recuperation de l`octet dans le fichier source*/
putc(c,fichier2); /*ecriture de l`octet dans le fichier cible*/
++increment; /*increment de i*/
} /*fin boucle de traitement*/
}
fclose(fichier1); /*cloture du fichier source*/
fclose(fichier2); /*cloture du fichier cible*/
printf("C'est fini !\n"); /*message ecran*/
printf("Nombre total d'octet transfere: %d\n",info_fichier.st_size); /*affichage du nombre d`octet transfere*/
/*---------------------*/
}


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.

Merci A+

Olivier

Il n'y a de dieu que DIEU, et Mouhammed est le messager de DIEU.

Poste le Thursday 24 November 2005 17:59:25
Répondre     Citer    
Re: programme en C sous windows
Envoyé par: Sve@r

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]

Poste le Thursday 24 November 2005 19:28:01
Répondre     Citer    
Re: programme en C sous windows
Envoyé par: oliv

Salut Sve@r

Pour commencer merci a toi pour tout aide.

Sinon pour ce qui est des "warning", lors de la compilation (sous linux) je n'ai eu aucun message d'erreur.

Tu dis egalement "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)" ", j'ai déjà essaye cela mais lors de l'utilisation de mon programme sur un fichier PDF le programme sortait tout de suite de la boucle. J'ai alors pensé qu'une erreur parasite, dans le fichier PDF.

La raison pour la qu'elle je ne teste pas l'ouverture de "image" c'est que ce fichier est créé par mon programme, je pensais que ce teste n'était pas utile. Me confirme tu cela? Si oui comme pourait-il en être autrement, puisque a la base le fichier n'existe pas?

Je terminerais sur mon plagiat (info_fichier), mille excuse mais c'est là le revers de tes conseils éclairés.

Je vais tester ta correction de mon programme et je te tiens au courant.

Bonne nuit et A+

Olivier

Il n'y a de dieu que DIEU, et Mouhammed est le messager de DIEU.

Poste le Thursday 24 November 2005 20:25:43
Répondre     Citer    
Re: programme en C sous windows
Envoyé par: Sve@r

Citation
oliv
Sinon pour ce qui est des "warning", lors de la
compilation (sous linux) je n'ai eu aucun message
d'erreur.
Hum... pas normal. &fsource n'est vraiment pas bon. Reessaye de compiler en mettant "-Wall" (Warnings All) juste pour rire...

Citation
oliv
Tu dis egalement "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)" ", j'ai déjà essaye cela mais lors de
l'utilisation de mon programme sur un fichier PDF le programme sortait tout de suite de la boucle. J'ai alors pensé qu'une erreur parasite, dans le fichier PDF.
Cette syntaxe fonctionne dans tous les cas. EOF n'est pas la valeur lue dans le fichier mais renvoyée par la fonction quand il n'y a plus rien à lire.
Seul détail: Normallement EOF étant de type "int", pour être vraiment rigoureux il faut déclarer "c" de type "int" même si 99% du temps il stocke un char.
Autre détail: L'importance des parenthèses. Ptet que tu as écrit
"while (c=fgetc(fichier1) != EOF)"
Ben là, ça ne fonctionne pas. Il commence par faire la comparaison "fgetc() != EOF" puis il affecte cette comparaison à "c"
Remarque: J'ai oublié une parenthèse dans mon code. C'est
"while ((c=fgetc(fichier1)) != EOF)" qu'il faut mettre

Citation
oliv
La raison pour la qu'elle je ne teste pas l'ouverture de "image" c'est que ce fichier est créé par mon programme, je pensais que ce teste n'était pas utile. Me confirme tu cela? Si oui comme pourait-il en être autrement, puisque a la base le fichier n'existe pas?
Il faut toujours tester les grandes opérations comme "allocation mémoire", "ouverture fichiers", etc. D'ailleurs tu avais fait une erreur de commentaires dans ton pgm. En testant "fopen" tu ne testes pas l'existence mais la réussite de l'ouverture. Le fait qu'on puisse pas ouvrir un fichier non-existant en lecture n'est qu'une raison parmi plusieurs qui fait que "fopen" renvoie NULL. Si tu tentes de lire un fichier sur lequel t'as pas accès "fopen()" renverra NULL. Idem si tu travailles dans un répertoire où tu peux pas écrire, tu pourras jamais ouvrir "image"

Citation
oliv
Je terminerais sur mon plagiat (info_fichier), mille excuse mais c'est là le revers de tes conseils éclairés.
C'est pas du plagiat, c'est du vol pur et simple. Tu imagines pas le travail qu'il a fallu à 12 équipes d'ingénieurs micro$oft pour trouver cette variable. Une plainte a d'ailleurs été déposée à la SACEM ce matin. Ils ont été très intéressés par ce cas ^^D-*

L'homme qui murmurait à l'oreille des pingouins
[fr.lang.free.fr]

Poste le Friday 25 November 2005 08:43:54
Répondre     Citer    
Re: programme en C sous windows
Envoyé par: oliv

Sve@r, t'a encore raison pour le -Wall (encore quelque chose que tu m'a appris), j'avais une erreur sur chaqu'une des ligne où il y avait &fsource.

Pour la cas des 12 équipes d'ingénieurs micro$oft, tu as oublie de stipuler qu'elles sont composé d'amerloc et donc il s'agit là de chercheur et non pas de "trouveur". Cela devrais jouer en ma faveur lors du proces.#%b

Il n'y a de dieu que DIEU, et Mouhammed est le messager de DIEU.

Poste le Friday 25 November 2005 19:30:40
Répondre     Citer    

Veuillez vous authentifier auparavant pour commenter.

 

Ce forum !
programme en C sous windows
Pour poser vos questions sur les scripts shell, le Perl, le C, etc... Attention : nous ne sommes pas des spécialistes du dev, ce forum est juste pour de petites aides ponctuelles concernant le développement et les outils de développement.

Sauf mention contraire, les documentations publiées sont sous licence Creative-Commons