Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Traduction d'un code en C

7 réponses
Avatar
Ranny
Bonjour tout le monde

Voila j'ai ce code en ANSI-C
#include <stdio.h
#include <string.h

main(


/* Noms des fichiers *
char ANCIEN[30], NOUVEAU[30];
FILE *INFILE, *OUTFILE
/*variables *
char NOM_PERS[30], NOM_MODIF[30], NOM_NOUV[30]
/* Ouverture de l'ancien fichier en lecture *
d

printf("C:\\test\\config.txt")
scanf("%s", ANCIEN)
INFILE = fopen(ANCIEN, "r");
if (!INFILE)
printf("\aERREUR: Impossible d'ouvrir
"le fichier: %s.\n", ANCIEN)

while (!INFILE)

/* Ouverture du nouveau fichier en écriture *
d

printf("C:\\test\\config2.txt")
scanf("%s", NOUVEAU)
OUTFILE = fopen(NOUVEAU, "w");
if (!OUTFILE)
printf("\aERREUR: Impossible d'ouvrir
"le fichier: %s.\n", NOUVEAU)

while (!OUTFILE)
/* Saisie de l'enregistrement à modifier, *
printf("Langage :ENG")
scanf("%s",NOM_MODIF)
/* et de sa nouvelle valeur. *
printf("Langage :Fr")
scanf("%s",NOM_NOUV)

/* copie *
while (!feof(INFILE)

fscanf(INFILE, "%s\n", NOM_PERS)
if (strcmp(NOM_PERS, NOM_MODIF) = 0
fprintf(OUTFILE, "%s\n", NOM_NOUV)
els
fprintf(OUTFILE, "%s\n", NOM_PERS)

/* Fermeture des fichiers *
fclose(OUTFILE)
fclose(INFILE)
return 0

Est ce que quelqu'un pourrait me le transcrire en c pour qu'il soit compilable sur DEV-C+
merci d'avance
rann

--
Ranny

-----------------------------------------------------------------------
Voir theme: http://www.frbox.net/viewtopic-531955.htm

Envoyé de http://www.frbox.ne

7 réponses

Avatar
Pierre Maurette
[...]
if (strcmp(NOM_PERS, NOM_MODIF) = 0)
if (strcmp(NOM_PERS, NOM_MODIF) == 0)

[...]

Est ce que quelqu'un pourrait me le transcrire en c pour qu'il soit
compilable sur DEV-C++ merci d'avance,
ranny


DevC++, c'est un emballage pour gcc sous Winsdows. Ça compile donc du
code ANSI-C (il faudrait préciser quelle version de C). Ici, ça doit
compiler votre truc avec les options par défaut.
Je n'ai pas p^lus regardé, il me semble qu'il y a quelques soucis
cosmétique, comme le main() ou le printf("bla"). Peut-être plus grave,
pas le temps de tester.

--
Pierre Maurette

Avatar
Emmanuel Delahaye
Bonjour tout le monde,

Voila j'ai ce code en ANSI-C


En est-tu bien sûr ?

#include <stdio.h>
#include <string.h>

main()


manque int

{

/* Noms des fichiers */
char ANCIEN[30], NOUVEAU[30];
FILE *INFILE, *OUTFILE;
/*variables */
char NOM_PERS[30], NOM_MODIF[30], NOM_NOUV[30];
/* Ouverture de l'ancien fichier en lecture */
do
{
printf("C:testconfig.txt");
scanf("%s", ANCIEN);


Dangereux... Risque de comportement indéfini.

INFILE = fopen(ANCIEN, "r");
if (!INFILE)
printf("aERREUR: Impossible d'ouvrir "
"le fichier: %s.n", ANCIEN);
}
while (!INFILE);


si le fichier n'existe pas, on boucle indéfiniment ? Sortie par
Ctrl-Break ?

/* Ouverture du nouveau fichier en écriture */
do
{
printf("C:testconfig2.txt");
scanf("%s", NOUVEAU);


Dangereux... Risque de comportement indéfini.

OUTFILE = fopen(NOUVEAU, "w");
if (!OUTFILE)
printf("aERREUR: Impossible d'ouvrir "
"le fichier: %s.n", NOUVEAU);
}
while (!OUTFILE);
/* Saisie de l'enregistrement à modifier, */
printf("Langage :ENG");
scanf("%s",NOM_MODIF);


Dangereux... Risque de comportement indéfini.

/* et de sa nouvelle valeur. */
printf("Langage :Fr");
scanf("%s",NOM_NOUV);


Dangereux... Risque de comportement indéfini.

/* copie */
while (!feof(INFILE))


Comportement non conforme aux attentes :
- Boucle infinie en cas d'erreur
- mauvaise lecture (lire 2 fois la dernière ligne, par exemple).

On doit tester la valeur retournée par la fonction de lecture.

{
fscanf(INFILE, "%sn", NOM_PERS);


Dangereux... Risque de comportement indéfini.

if (strcmp(NOM_PERS, NOM_MODIF) = 0)


Ne compile pas. On ne peut pas affecter une valeur à une fonction. Ca
n'a aucun sens. Tu voulais sans doute dire '=='.

fprintf(OUTFILE, "%sn", NOM_NOUV);
else
fprintf(OUTFILE, "%sn", NOM_PERS);
}
/* Fermeture des fichiers */
fclose(OUTFILE);
fclose(INFILE);
return 0;
}
Est ce que quelqu'un pourrait me le transcrire en c pour qu'il soit
compilable sur DEV-C++


Curieuse question. Si il est 'ANSI-C', il n'y a rien à modifier pour
qu'il compile sur n'importe quel compilateur/IDE...

Ton vrai problème est qu'il *n'est pas* ANSI-C et qu'il doit être corrigé.

Revoir d'urgence l'utilisation des fonctions de saisie (et de lecture de
fichier texte, c'est le même problème et la même solution)

http://mapage.noos.fr/emdel/notes.htm#saisie
http://mapage.noos.fr/emdel/notes.htm#fichiers

--
A+

Emmanuel Delahaye

Avatar
Pierre Maurette
[...]
if (strcmp(NOM_PERS, NOM_MODIF) = 0)


Ne compile pas. On ne peut pas affecter une valeur à une fonction. Ca n'a
aucun sens.
A lire, on pourrait penser que affecter une valeur à un retour de

fonction n'a *par essence* aucun sens, alors qu'en fait c'est
simplement impossible de le faire directement en C.

La sémantique de cette affectation sera obtenue en C par des pointeurs:

#include <stdio.h>

int* f(int* a, int* b, int condition){return condition?a:b;}

int main(void)
{
int a = 10, b = 15;
printf("%dt%dn", a, b);
*f(&a, &b, 1) = 20;
printf("%dt%dn", a, b);
return 0;
}


Et en mauvais C++ :

#include <stdio.h>

int& f(int& a, int& b, int condition){return condition?a:b;}

int main(void)
{
int a = 10, b = 15;
printf("%dt%dn", a, b);
f(a, b, 0) = 20;
printf("%dt%dn", a, b);
return 0;
}

--
Pierre Maurette


Avatar
Antoine Leca
In news:, Ranny va escriure:

Ton programme devrait compiler avec Dev-C++. Qu'est-ce qui va pas ?


main()


int main(void). FAQ 9.4

char ANCIEN[30], NOUVEAU[30];


char ANCIEN[FILENAME_MAX], NOUVEAU[FILENAME_MAX];

printf("C:testconfig.txt");
scanf("%s", ANCIEN);


Tu veux mettre C:testconfig.txt comme nom de fichier dans ANCIEN ? cela
s'écrirait

strcpy(ANCIEN, "C:/test/config.txt");

Sinon, si tu veux réellement saisir le nom au clavier, il faudrait changer
le texte de ton message, et ajouter un
fflush(stdout);
après le printf(), FAQ 14.6.
Et aussi utiliser fgets à la place de scanf(), FAQ 8.8.


while (!feof(INFILE))


C n'est pas Pascal. Pour détecter la fin de fichier, plutôt que que
d'utiliser feof(), il faut se fier à ce que retourne les fonctions de
lecture (fscanf() dans ton cas) : à la fin du fichier elles retourneront un
code spécial (EOF pour fscanf()), et il convient de réagir dès l'apparition
de ce code, et non pas à la prochaine itération comme le fait ton programme
(qui va écrire deux fois la dernière ligne, c'est un peu dommage).
En règle générale, chaque appel de fonction devrait être controlë pour
savoir s'il n'y a pas eu un quelconque problème ; ce devrait être
systématique pour les lectures d'entrées-sorties ou les écritures de fichier
disque (et les allocations mémoire).


C'est un problème classique (mais ce n'est pas dans la FAQ).


Antoine

Avatar
Antoine Leca
En news:43dd2920$0$8457$,
Emmanuel Delahaye va escriure:
if (strcmp(NOM_PERS, NOM_MODIF) = 0)


Ne compile pas. On ne peut pas affecter une valeur à une fonction. Ca
n'a aucun sens. Tu voulais sans doute dire '=='.


Tiens, je l'avais loupé celui-là. Preuve que je n'ai même pas essayé de
compiler ;-)
Emmanuel a raison, bien sûr.


Antoine


Avatar
Harpo
Antoine Leca wrote:

In news:, Ranny va escriure:

Ton programme devrait compiler avec Dev-C++. Qu'est-ce qui va pas ?


main()


int main(void). FAQ 9.4

char ANCIEN[30], NOUVEAU[30];


char ANCIEN[FILENAME_MAX], NOUVEAU[FILENAME_MAX];


Et tant qu'à faire, mettre ANCIEN et NOUVEAU en minuscules, cette
manière de coder m'offusque. Bien que ce soit correct, cela rompt avec
l'usage, crée une fatigue supplémentaire au mainteneur et augmente les
possibilités de trous de sécurité (même sociale en raison de cette
maladie trop méconnue : le stress du programmeur).

--
http://harpo.free.fr/


Avatar
Antoine Leca
En news:43de1f7d$0$19711$, Harpo va escriure:
Antoine Leca wrote:

In news:, Ranny va escriure:
char ANCIEN[30], NOUVEAU[30];


char ANCIEN[FILENAME_MAX], NOUVEAU[FILENAME_MAX];


Et tant qu'à faire, mettre ANCIEN et NOUVEAU en minuscules,


Oui.

Z'ai oublié de le dire (j'ai été choqué, pas offusqué, mais choqué). Zà fait
deux trucs que z'ai oublié sur ce message, il va falloir que ze me
zurveille.


Antoine