Eh non même pas stagiaire mais récemment arrivée j'avoue ! Et en plus je
suis une vraie fille (incroyable non ?), et vraiment susceptible aussi !!
En tous cas, merci beaucoup à Anthony et Régis. Je n'ai pas encore eu le
temps de tout regarder mais voici ce que donne le debugger :
Program received signal SIGSEGV, Segmentation fault.
0x42031d51 in __strtod_internal () from /lib/tls/libc.so.6
Et le plantage intervient juste après la saisie du nombre de couple (u,v)
Eh non même pas stagiaire mais récemment arrivée j'avoue ! Et en plus je
suis une vraie fille (incroyable non ?), et vraiment susceptible aussi !!
En tous cas, merci beaucoup à Anthony et Régis. Je n'ai pas encore eu le
temps de tout regarder mais voici ce que donne le debugger :
Program received signal SIGSEGV, Segmentation fault.
0x42031d51 in __strtod_internal () from /lib/tls/libc.so.6
Et le plantage intervient juste après la saisie du nombre de couple (u,v)
Eh non même pas stagiaire mais récemment arrivée j'avoue ! Et en plus je
suis une vraie fille (incroyable non ?), et vraiment susceptible aussi !!
En tous cas, merci beaucoup à Anthony et Régis. Je n'ai pas encore eu le
temps de tout regarder mais voici ce que donne le debugger :
Program received signal SIGSEGV, Segmentation fault.
0x42031d51 in __strtod_internal () from /lib/tls/libc.so.6
Et le plantage intervient juste après la saisie du nombre de couple (u,v)
sprintf(sortie,"%s.res",entree);
Et boum ! sortie a de quoi contenir 80 char, mais ce n'est à priori pas
une
chaine, si il n'y a pas de ' ' (caractère de fin de chaine)quelquepart
dedans.
La solution, remplir sortie de zéros (ce qu'est ' ') avec memset par
exemple:
memset(sortie, 0, sizeof sortie);
sprintf(sortie,"%s.res", entree);
d'après la norme (§ 7.19.6.6)
<Quote>
The sprintf function is equivalent to fprintf, except that the output is
written into an array (specified by the argument s) rather than to a
stream. _A null character_ is written at the end of the characters
written; it is not counted as part of the returned value. If copying
takes place between objects that overlap, the behavior is undefined.
</Quote>
Donc ca risque de faire boom, mais pas parce que le ' ' manque.
L'appel à memset ne sert à rien (sauf à perdre du temps).
sprintf(sortie,"%s.res",entree);
Et boum ! sortie a de quoi contenir 80 char, mais ce n'est à priori pas
une
chaine, si il n'y a pas de ' ' (caractère de fin de chaine)quelquepart
dedans.
La solution, remplir sortie de zéros (ce qu'est ' ') avec memset par
exemple:
memset(sortie, 0, sizeof sortie);
sprintf(sortie,"%s.res", entree);
d'après la norme (§ 7.19.6.6)
<Quote>
The sprintf function is equivalent to fprintf, except that the output is
written into an array (specified by the argument s) rather than to a
stream. _A null character_ is written at the end of the characters
written; it is not counted as part of the returned value. If copying
takes place between objects that overlap, the behavior is undefined.
</Quote>
Donc ca risque de faire boom, mais pas parce que le ' ' manque.
L'appel à memset ne sert à rien (sauf à perdre du temps).
sprintf(sortie,"%s.res",entree);
Et boum ! sortie a de quoi contenir 80 char, mais ce n'est à priori pas
une
chaine, si il n'y a pas de ' ' (caractère de fin de chaine)quelquepart
dedans.
La solution, remplir sortie de zéros (ce qu'est ' ') avec memset par
exemple:
memset(sortie, 0, sizeof sortie);
sprintf(sortie,"%s.res", entree);
d'après la norme (§ 7.19.6.6)
<Quote>
The sprintf function is equivalent to fprintf, except that the output is
written into an array (specified by the argument s) rather than to a
stream. _A null character_ is written at the end of the characters
written; it is not counted as part of the returned value. If copying
takes place between objects that overlap, the behavior is undefined.
</Quote>
Donc ca risque de faire boom, mais pas parce que le ' ' manque.
L'appel à memset ne sert à rien (sauf à perdre du temps).
Program received signal SIGSEGV, Segmentation fault.
0x42031d51 in __strtod_internal () from /lib/tls/libc.so.6
Et le plantage intervient juste après la saisie du nombre de couple (u,v)
Program received signal SIGSEGV, Segmentation fault.
0x42031d51 in __strtod_internal () from /lib/tls/libc.so.6
Et le plantage intervient juste après la saisie du nombre de couple (u,v)
Program received signal SIGSEGV, Segmentation fault.
0x42031d51 in __strtod_internal () from /lib/tls/libc.so.6
Et le plantage intervient juste après la saisie du nombre de couple (u,v)
Bon, et bien ca s'eclaircit : même si tu n'a pas de strtod() dans ton
code original, appeler la fonction atof()
avec mettons atof(ptr); est équivalent à appeler strtod(ptr,
(char**)NULL); Anthony avait raison, il y a donc de grandes chances que
3. J'avais repéré un scanf("%s",&entree); avec char entree[80] dans le
code original. Attention, entree "est déjà" un char *.
Bon, et bien ca s'eclaircit : même si tu n'a pas de strtod() dans ton
code original, appeler la fonction atof()
avec mettons atof(ptr); est équivalent à appeler strtod(ptr,
(char**)NULL); Anthony avait raison, il y a donc de grandes chances que
3. J'avais repéré un scanf("%s",&entree); avec char entree[80] dans le
code original. Attention, entree "est déjà" un char *.
Bon, et bien ca s'eclaircit : même si tu n'a pas de strtod() dans ton
code original, appeler la fonction atof()
avec mettons atof(ptr); est équivalent à appeler strtod(ptr,
(char**)NULL); Anthony avait raison, il y a donc de grandes chances que
3. J'avais repéré un scanf("%s",&entree); avec char entree[80] dans le
code original. Attention, entree "est déjà" un char *.
In 'fr.comp.lang.c', "Régis Troadec" wrote:
Bon, et bien ca s'eclaircit : même si tu n'a pas de strtod() dans ton
code original, appeler la fonction atof()
avec mettons atof(ptr); est équivalent à appeler strtod(ptr,
(char**)NULL); Anthony avait raison, il y a donc de grandes chances que
Ouch! C'est quoi ce cast de la mort?
strtod (ptr, NULL);
est suffisant, non? Pourquoi obscurcir le code ?
Il est préférable d'utiliser une fonction de saisie de ligne basée sur
fgetc() ou fgets().
Des exemples ici :
http://mapage.noos.fr/emdel/clib.htm module IO
In 'fr.comp.lang.c', "Régis Troadec" <regt@wanadoo.fr> wrote:
Bon, et bien ca s'eclaircit : même si tu n'a pas de strtod() dans ton
code original, appeler la fonction atof()
avec mettons atof(ptr); est équivalent à appeler strtod(ptr,
(char**)NULL); Anthony avait raison, il y a donc de grandes chances que
Ouch! C'est quoi ce cast de la mort?
strtod (ptr, NULL);
est suffisant, non? Pourquoi obscurcir le code ?
Il est préférable d'utiliser une fonction de saisie de ligne basée sur
fgetc() ou fgets().
Des exemples ici :
http://mapage.noos.fr/emdel/clib.htm module IO
In 'fr.comp.lang.c', "Régis Troadec" wrote:
Bon, et bien ca s'eclaircit : même si tu n'a pas de strtod() dans ton
code original, appeler la fonction atof()
avec mettons atof(ptr); est équivalent à appeler strtod(ptr,
(char**)NULL); Anthony avait raison, il y a donc de grandes chances que
Ouch! C'est quoi ce cast de la mort?
strtod (ptr, NULL);
est suffisant, non? Pourquoi obscurcir le code ?
Il est préférable d'utiliser une fonction de saisie de ligne basée sur
fgetc() ou fgets().
Des exemples ici :
http://mapage.noos.fr/emdel/clib.htm module IO
http://mapage.noos.fr/emdel/clib.htm module IO
Suggestion : lien à ajouter dans la FAQ. Ca fait depuis 1 mois environ que
j'ai connaissance de ton site en furetant sur c.l.c et c'est vraiment de
l'excellent code bien documenté.
Tu devrais même rajouter le lien de ton
site dans ta signature.
http://mapage.noos.fr/emdel/clib.htm module IO
Suggestion : lien à ajouter dans la FAQ. Ca fait depuis 1 mois environ que
j'ai connaissance de ton site en furetant sur c.l.c et c'est vraiment de
l'excellent code bien documenté.
Tu devrais même rajouter le lien de ton
site dans ta signature.
http://mapage.noos.fr/emdel/clib.htm module IO
Suggestion : lien à ajouter dans la FAQ. Ca fait depuis 1 mois environ que
j'ai connaissance de ton site en furetant sur c.l.c et c'est vraiment de
l'excellent code bien documenté.
Tu devrais même rajouter le lien de ton
site dans ta signature.
Des exemples ici :
http://mapage.noos.fr/emdel/clib.htm module IO
Suggestion : lien à ajouter dans la FAQ.
Des exemples ici :
http://mapage.noos.fr/emdel/clib.htm module IO
Suggestion : lien à ajouter dans la FAQ.
Des exemples ici :
http://mapage.noos.fr/emdel/clib.htm module IO
Suggestion : lien à ajouter dans la FAQ.
http://mapage.noos.fr/emdel/clib.htm module IO
Si je puis me permettre, elle est vraiment excellente, cette page.
Bravo, tout simplement !
Au passage, je suis en train d'écrire un document sur la modularité.
Même si cette page web n'est pas complète, puis-je ajouter le lien
(ci-dessus) dans mon document ?
http://mapage.noos.fr/emdel/clib.htm module IO
Si je puis me permettre, elle est vraiment excellente, cette page.
Bravo, tout simplement !
Au passage, je suis en train d'écrire un document sur la modularité.
Même si cette page web n'est pas complète, puis-je ajouter le lien
(ci-dessus) dans mon document ?
http://mapage.noos.fr/emdel/clib.htm module IO
Si je puis me permettre, elle est vraiment excellente, cette page.
Bravo, tout simplement !
Au passage, je suis en train d'écrire un document sur la modularité.
Même si cette page web n'est pas complète, puis-je ajouter le lien
(ci-dessus) dans mon document ?
Au passage, je suis en train d'écrire un document sur la modularité.
Même si cette page web n'est pas complète, puis-je ajouter le lien
(ci-dessus) dans mon document ?
Oui.
Au passage, je suis en train d'écrire un document sur la modularité.
Même si cette page web n'est pas complète, puis-je ajouter le lien
(ci-dessus) dans mon document ?
Oui.
Au passage, je suis en train d'écrire un document sur la modularité.
Même si cette page web n'est pas complète, puis-je ajouter le lien
(ci-dessus) dans mon document ?
Oui.
"Elodie" a écrit dans le message de
news:c8f0uc$buo$Program received signal SIGSEGV, Segmentation fault.
0x42031d51 in __strtod_internal () from /lib/tls/libc.so.6
Et le plantage intervient juste après la saisie du nombre de couple
(u,v)
Bon, et bien ca s'eclaircit : même si tu n'a pas de strtod() dans ton code
original, appeler la fonction atof()
avec mettons atof(ptr); est équivalent à appeler strtod(ptr,
(char**)NULL);
Anthony avait raison, il y a donc de grandes chances que ptr soit nul dans
ton cas, soupçon plus porté sur la fonction lecture_ligne().
Tu peux soit directement blinder ton code, ou utiliser dans un premier
temps
la macro assert(EXPR) (<assert.h>) pour un debug rapide. Si l'expression
EXPR est fausse (donc l'assertion), le programme se termine en affichant
ce
qui ne va pas avec nom du fichier source et ligne.
J'ai réécris ton programme en incluant mes propositions avec un support de
debug minimaliste. J'utilise aussi l'indicateur d'erreur errno (inclure
<errno.h>) qui est un entier prenant différents codes d'erreur (ce sont
les
fonctions de la bibliothèque standard C qui mettent errno à telle ou telle
valeur, exple, strtod() met errno à ERANGE pour signaler que lors de la
conversion chaine -> double, la valeur renvoyée est hors du domaine des
valeurs).
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <errno.h>
/*
#include <fp.h>
#include <math.h>
*/
#include "../include/herve.h"
#define FICHIER 0
#define UV 1
void traitementVentFicVersFic(FILE * f_src, FILE * f_dst, int nb);
int main(int argc, char *argv[])
{
char entree[80],sortie[80];
float u, v, ff;
int rep, ddtu trouveras sur le net pas mal d'exemples, nb, type;
if (argc==3)
{
if (strlen(argv[1])<=5)
{
type = UV;
u = (float)strtod(argv[1], NULL);
assert(errno != ERANGE);
v = (float)strtod(argv[2], NULL);
assert(errno != ERANGE);
}
else
{
type = FICHIER;
memset(entree, 0, sizeof entree);
strncpy(entree, argv[1], sizeof entree - 1);
nb = (int)strtol(argv[2], NULL, 10);
assert(errno != ERANGE);
}
}
else
{
printf("Conversion des coordonnees (u,v) d'un vent en (dd,ff)n");
printf("-----------------------------------------------------n");
printf("1 => Saisie d'un couple (u,v)n");
printf("2 => Traitement sur un fichier de donnees ?n");
scanf("%d",&rep);
if (rep!=1 && rep!=2)
{
exit(EXIT_FAILURE);
}
if (rep==1)
{
type = UV;
printf("Coordonnee u ? n");
scanf("%f",&u);
printf("Coordonnee v ? n");
scanf("%f",&v);
}
else
{
type = FICHIER;
printf("Nom du fichier a traiter ? ");
scanf("%s",entree);
printf("Nombre de couples (u,v) par enregistrement ? ");
scanf("%d",&nb);
}
}
if (type==UV)
{
vent_uv_ddff(u,v,&dd,&ff);
printf("dd=%d ff=%.1fn",dd,ff);
}
else
{
FILE *fp1,*fp2;
fp1=fopen(entree,"r");
if (fp1 != NULL)
{
if ( (strlen(entree)+4) < (sizeof sortie - 1) )
sprintf(sortie,"%s.res", entree);
fp2=fopen(sortie,"w");
if (fp2 != NULL)
{
traitementVentFicVersFic(fp1, fp2, nb);
fclose(fp2);
}
else
{
fprintf(stderr,"Le fichier %s n'existe pas!n",sortie);
exit(EXIT_FAILURE);
}
fclose(fp1);
}
else
{
fprintf(stderr,"Le fichier %s n'existe pas!n",entree);
exit(EXIT_FAILURE);
}
}
return 0;
}
void traitementVentFicVersFic(FILE * f_src, FILE * f_dst, int nb)
{
char chaine[160], *p;
float u,v,ff;
int n,dd;
while(fgets(chaine,160,f_src) != NULL)
{
if (chaine[0] == 'n') continue;
p = strtok(chaine,";");
n = 1;
while (p != NULL && n < 4)
{
fprintf(f_dst,"%s;",p);
p = strtok(NULL,";");
++n;
}
for (n=1; n<=nb; n++)
{
p = strtok(NULL,";");
assert(p != NULL);
u = (float)strtod(p, NULL);
assert(errno != ERANGE);
p = strtok(NULL,";");
assert(p != NULL);
v = (float)strtod(p, NULL);
assert(errno != ERANGE);
vent_uv_ddff(u,v,&dd,&ff);
fprintf(f_dst,"%d;%.2f;",dd,ff);
}
fprintf(f_dst,"n");
}
}
Regis
Notas :
1. Pq pas utiliser des double à la place des float ?
("vent_uv_ddff() en a besoin" n'est pas une bonne raison)
2. <math.h> ne sert à rien ici.
3. J'avais repéré un scanf("%s",&entree); avec char entree[80] dans le
code
original. Attention, entree "est déjà" un char *.
"Elodie" <elodie@esub2.com> a écrit dans le message de
news:c8f0uc$buo$1@sxcom1.cnrm.meteo.fr...
Program received signal SIGSEGV, Segmentation fault.
0x42031d51 in __strtod_internal () from /lib/tls/libc.so.6
Et le plantage intervient juste après la saisie du nombre de couple
(u,v)
Bon, et bien ca s'eclaircit : même si tu n'a pas de strtod() dans ton code
original, appeler la fonction atof()
avec mettons atof(ptr); est équivalent à appeler strtod(ptr,
(char**)NULL);
Anthony avait raison, il y a donc de grandes chances que ptr soit nul dans
ton cas, soupçon plus porté sur la fonction lecture_ligne().
Tu peux soit directement blinder ton code, ou utiliser dans un premier
temps
la macro assert(EXPR) (<assert.h>) pour un debug rapide. Si l'expression
EXPR est fausse (donc l'assertion), le programme se termine en affichant
ce
qui ne va pas avec nom du fichier source et ligne.
J'ai réécris ton programme en incluant mes propositions avec un support de
debug minimaliste. J'utilise aussi l'indicateur d'erreur errno (inclure
<errno.h>) qui est un entier prenant différents codes d'erreur (ce sont
les
fonctions de la bibliothèque standard C qui mettent errno à telle ou telle
valeur, exple, strtod() met errno à ERANGE pour signaler que lors de la
conversion chaine -> double, la valeur renvoyée est hors du domaine des
valeurs).
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <errno.h>
/*
#include <fp.h>
#include <math.h>
*/
#include "../include/herve.h"
#define FICHIER 0
#define UV 1
void traitementVentFicVersFic(FILE * f_src, FILE * f_dst, int nb);
int main(int argc, char *argv[])
{
char entree[80],sortie[80];
float u, v, ff;
int rep, ddtu trouveras sur le net pas mal d'exemples, nb, type;
if (argc==3)
{
if (strlen(argv[1])<=5)
{
type = UV;
u = (float)strtod(argv[1], NULL);
assert(errno != ERANGE);
v = (float)strtod(argv[2], NULL);
assert(errno != ERANGE);
}
else
{
type = FICHIER;
memset(entree, 0, sizeof entree);
strncpy(entree, argv[1], sizeof entree - 1);
nb = (int)strtol(argv[2], NULL, 10);
assert(errno != ERANGE);
}
}
else
{
printf("Conversion des coordonnees (u,v) d'un vent en (dd,ff)n");
printf("-----------------------------------------------------n");
printf("1 => Saisie d'un couple (u,v)n");
printf("2 => Traitement sur un fichier de donnees ?n");
scanf("%d",&rep);
if (rep!=1 && rep!=2)
{
exit(EXIT_FAILURE);
}
if (rep==1)
{
type = UV;
printf("Coordonnee u ? n");
scanf("%f",&u);
printf("Coordonnee v ? n");
scanf("%f",&v);
}
else
{
type = FICHIER;
printf("Nom du fichier a traiter ? ");
scanf("%s",entree);
printf("Nombre de couples (u,v) par enregistrement ? ");
scanf("%d",&nb);
}
}
if (type==UV)
{
vent_uv_ddff(u,v,&dd,&ff);
printf("dd=%d ff=%.1fn",dd,ff);
}
else
{
FILE *fp1,*fp2;
fp1=fopen(entree,"r");
if (fp1 != NULL)
{
if ( (strlen(entree)+4) < (sizeof sortie - 1) )
sprintf(sortie,"%s.res", entree);
fp2=fopen(sortie,"w");
if (fp2 != NULL)
{
traitementVentFicVersFic(fp1, fp2, nb);
fclose(fp2);
}
else
{
fprintf(stderr,"Le fichier %s n'existe pas!n",sortie);
exit(EXIT_FAILURE);
}
fclose(fp1);
}
else
{
fprintf(stderr,"Le fichier %s n'existe pas!n",entree);
exit(EXIT_FAILURE);
}
}
return 0;
}
void traitementVentFicVersFic(FILE * f_src, FILE * f_dst, int nb)
{
char chaine[160], *p;
float u,v,ff;
int n,dd;
while(fgets(chaine,160,f_src) != NULL)
{
if (chaine[0] == 'n') continue;
p = strtok(chaine,";");
n = 1;
while (p != NULL && n < 4)
{
fprintf(f_dst,"%s;",p);
p = strtok(NULL,";");
++n;
}
for (n=1; n<=nb; n++)
{
p = strtok(NULL,";");
assert(p != NULL);
u = (float)strtod(p, NULL);
assert(errno != ERANGE);
p = strtok(NULL,";");
assert(p != NULL);
v = (float)strtod(p, NULL);
assert(errno != ERANGE);
vent_uv_ddff(u,v,&dd,&ff);
fprintf(f_dst,"%d;%.2f;",dd,ff);
}
fprintf(f_dst,"n");
}
}
Regis
Notas :
1. Pq pas utiliser des double à la place des float ?
("vent_uv_ddff() en a besoin" n'est pas une bonne raison)
2. <math.h> ne sert à rien ici.
3. J'avais repéré un scanf("%s",&entree); avec char entree[80] dans le
code
original. Attention, entree "est déjà" un char *.
"Elodie" a écrit dans le message de
news:c8f0uc$buo$Program received signal SIGSEGV, Segmentation fault.
0x42031d51 in __strtod_internal () from /lib/tls/libc.so.6
Et le plantage intervient juste après la saisie du nombre de couple
(u,v)
Bon, et bien ca s'eclaircit : même si tu n'a pas de strtod() dans ton code
original, appeler la fonction atof()
avec mettons atof(ptr); est équivalent à appeler strtod(ptr,
(char**)NULL);
Anthony avait raison, il y a donc de grandes chances que ptr soit nul dans
ton cas, soupçon plus porté sur la fonction lecture_ligne().
Tu peux soit directement blinder ton code, ou utiliser dans un premier
temps
la macro assert(EXPR) (<assert.h>) pour un debug rapide. Si l'expression
EXPR est fausse (donc l'assertion), le programme se termine en affichant
ce
qui ne va pas avec nom du fichier source et ligne.
J'ai réécris ton programme en incluant mes propositions avec un support de
debug minimaliste. J'utilise aussi l'indicateur d'erreur errno (inclure
<errno.h>) qui est un entier prenant différents codes d'erreur (ce sont
les
fonctions de la bibliothèque standard C qui mettent errno à telle ou telle
valeur, exple, strtod() met errno à ERANGE pour signaler que lors de la
conversion chaine -> double, la valeur renvoyée est hors du domaine des
valeurs).
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <errno.h>
/*
#include <fp.h>
#include <math.h>
*/
#include "../include/herve.h"
#define FICHIER 0
#define UV 1
void traitementVentFicVersFic(FILE * f_src, FILE * f_dst, int nb);
int main(int argc, char *argv[])
{
char entree[80],sortie[80];
float u, v, ff;
int rep, ddtu trouveras sur le net pas mal d'exemples, nb, type;
if (argc==3)
{
if (strlen(argv[1])<=5)
{
type = UV;
u = (float)strtod(argv[1], NULL);
assert(errno != ERANGE);
v = (float)strtod(argv[2], NULL);
assert(errno != ERANGE);
}
else
{
type = FICHIER;
memset(entree, 0, sizeof entree);
strncpy(entree, argv[1], sizeof entree - 1);
nb = (int)strtol(argv[2], NULL, 10);
assert(errno != ERANGE);
}
}
else
{
printf("Conversion des coordonnees (u,v) d'un vent en (dd,ff)n");
printf("-----------------------------------------------------n");
printf("1 => Saisie d'un couple (u,v)n");
printf("2 => Traitement sur un fichier de donnees ?n");
scanf("%d",&rep);
if (rep!=1 && rep!=2)
{
exit(EXIT_FAILURE);
}
if (rep==1)
{
type = UV;
printf("Coordonnee u ? n");
scanf("%f",&u);
printf("Coordonnee v ? n");
scanf("%f",&v);
}
else
{
type = FICHIER;
printf("Nom du fichier a traiter ? ");
scanf("%s",entree);
printf("Nombre de couples (u,v) par enregistrement ? ");
scanf("%d",&nb);
}
}
if (type==UV)
{
vent_uv_ddff(u,v,&dd,&ff);
printf("dd=%d ff=%.1fn",dd,ff);
}
else
{
FILE *fp1,*fp2;
fp1=fopen(entree,"r");
if (fp1 != NULL)
{
if ( (strlen(entree)+4) < (sizeof sortie - 1) )
sprintf(sortie,"%s.res", entree);
fp2=fopen(sortie,"w");
if (fp2 != NULL)
{
traitementVentFicVersFic(fp1, fp2, nb);
fclose(fp2);
}
else
{
fprintf(stderr,"Le fichier %s n'existe pas!n",sortie);
exit(EXIT_FAILURE);
}
fclose(fp1);
}
else
{
fprintf(stderr,"Le fichier %s n'existe pas!n",entree);
exit(EXIT_FAILURE);
}
}
return 0;
}
void traitementVentFicVersFic(FILE * f_src, FILE * f_dst, int nb)
{
char chaine[160], *p;
float u,v,ff;
int n,dd;
while(fgets(chaine,160,f_src) != NULL)
{
if (chaine[0] == 'n') continue;
p = strtok(chaine,";");
n = 1;
while (p != NULL && n < 4)
{
fprintf(f_dst,"%s;",p);
p = strtok(NULL,";");
++n;
}
for (n=1; n<=nb; n++)
{
p = strtok(NULL,";");
assert(p != NULL);
u = (float)strtod(p, NULL);
assert(errno != ERANGE);
p = strtok(NULL,";");
assert(p != NULL);
v = (float)strtod(p, NULL);
assert(errno != ERANGE);
vent_uv_ddff(u,v,&dd,&ff);
fprintf(f_dst,"%d;%.2f;",dd,ff);
}
fprintf(f_dst,"n");
}
}
Regis
Notas :
1. Pq pas utiliser des double à la place des float ?
("vent_uv_ddff() en a besoin" n'est pas une bonne raison)
2. <math.h> ne sert à rien ici.
3. J'avais repéré un scanf("%s",&entree); avec char entree[80] dans le
code
original. Attention, entree "est déjà" un char *.