rewind et fseek ne revienne pas au début du fichier
2 réponses
bpascal123
Bonjour cyberspace,
Le code ci-dessous, toujours dans le but d'apprendre quelques =E9l=E9ments
du C... ne fonctionne comme je pourrais m'attendre. En effet, rewind
ou fseek comme mentionn=E9s reviennent au deuxi=E8me caract=E8re et
"zappent" la premiere lettre ou le premier caractere d'un fichier pour
un fichier texte...
Solution un peu lourde, fermer le fichier avec fclose et ouvrir une
deuxi=E8me fois le fichier en lecture pour commencer la lecture au
d=E9but...
/*
A l'aide d'un =E9diteur de textes, cr=E9er un fichier NOMBRES.TXT qui
contient une liste de nombres entiers. Dans le fichier, chaque nombre
doit =EAtre suivi par un retour =E0 la ligne. Ecrire un programme qui
affiche les nombres du fichier, leur somme et leur moyenne.
*/
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
JKB
Le Sat, 18 Dec 2010 11:16:01 -0800 (PST), écrivait :
Bonjour cyberspace,
J'ai pour habitude de ne pas parler aux Cybernautes ;-) Pour ceux qui n'auraient pas compris, je mettrai la référence dans un prochain post.
Le code ci-dessous, toujours dans le but d'apprendre quelques éléments du C... ne fonctionne comme je pourrais m'attendre. En effet, rewind ou fseek comme mentionnés reviennent au deuxième caractère et "zappent" la premiere lettre ou le premier caractere d'un fichier pour un fichier texte...
Pourtant fseek() et rewind() à font bien ce que tu leur demandes. Le problème n'est pas là.
Solution un peu lourde, fermer le fichier avec fclose et ouvrir une deuxième fois le fichier en lecture pour commencer la lecture au début...
M'étonnerais, ça. Regarde un peu comment tu lis ton fichier.
/* A l'aide d'un éditeur de textes, créer un fichier NOMBRES.TXT qui contient une liste de nombres entiers. Dans le fichier, chaque nombre doit être suivi par un retour à la ligne. Ecrire un programme qui affiche les nombres du fichier, leur somme et leur moyenne. */
printf("nAffichage tableau passe en parametre : n") ; s = ReadFile(MP_FILE, MTab, nbrec) ;
printf("nnLa somme du tableau est : %dn", s) ; printf("nLa moyenne des nombres est : %dn", s/nbrec) ;
fclose(MP_FILE) ;
printf("nn") ; return 0 ; }
int CntRec(FILE *FP_FILE, int FTab[]) { int i ; int var ; int c ;
while ((c = fgetc(FP_FILE)) != EOF) for (i = 0 ; ((fscanf(FP_FILE, "%d", &var)) != EOF) ; i++) ;
return i ; }
int ReadFile(FILE *FP_FILE, int FTab[], int n) { int var ; int i ; int c ; int s = 0 ;
// Il y a comme un <censure> dans le potage ligne suivante
while ((c = fgetc(FP_FILE)) != EOF) { for (i = 0 ; ((fscanf(FP_FILE, "%d", &var)) != EOF) ; i++) { printf("n%d", var) ; s += var ; } } return s ; }
Merci,
De rien,
JKB
-- Si votre demande me parvient sur carte perforée, je titiouaillerai très volontiers une réponse... => http://grincheux.de-charybde-en-scylla.fr
Le Sat, 18 Dec 2010 11:16:01 -0800 (PST),
bpascal123@googlemail.com <bpascal123@googlemail.com> écrivait :
Bonjour cyberspace,
J'ai pour habitude de ne pas parler aux Cybernautes ;-)
Pour ceux qui n'auraient pas compris, je mettrai la référence dans
un prochain post.
Le code ci-dessous, toujours dans le but d'apprendre quelques éléments
du C... ne fonctionne comme je pourrais m'attendre. En effet, rewind
ou fseek comme mentionnés reviennent au deuxième caractère et
"zappent" la premiere lettre ou le premier caractere d'un fichier pour
un fichier texte...
Pourtant fseek() et rewind() à font bien ce que tu leur demandes. Le
problème n'est pas là.
Solution un peu lourde, fermer le fichier avec fclose et ouvrir une
deuxième fois le fichier en lecture pour commencer la lecture au
début...
M'étonnerais, ça. Regarde un peu comment tu lis ton fichier.
/*
A l'aide d'un éditeur de textes, créer un fichier NOMBRES.TXT qui
contient une liste de nombres entiers. Dans le fichier, chaque nombre
doit être suivi par un retour à la ligne. Ecrire un programme qui
affiche les nombres du fichier, leur somme et leur moyenne.
*/
Le Sat, 18 Dec 2010 11:16:01 -0800 (PST), écrivait :
Bonjour cyberspace,
J'ai pour habitude de ne pas parler aux Cybernautes ;-) Pour ceux qui n'auraient pas compris, je mettrai la référence dans un prochain post.
Le code ci-dessous, toujours dans le but d'apprendre quelques éléments du C... ne fonctionne comme je pourrais m'attendre. En effet, rewind ou fseek comme mentionnés reviennent au deuxième caractère et "zappent" la premiere lettre ou le premier caractere d'un fichier pour un fichier texte...
Pourtant fseek() et rewind() à font bien ce que tu leur demandes. Le problème n'est pas là.
Solution un peu lourde, fermer le fichier avec fclose et ouvrir une deuxième fois le fichier en lecture pour commencer la lecture au début...
M'étonnerais, ça. Regarde un peu comment tu lis ton fichier.
/* A l'aide d'un éditeur de textes, créer un fichier NOMBRES.TXT qui contient une liste de nombres entiers. Dans le fichier, chaque nombre doit être suivi par un retour à la ligne. Ecrire un programme qui affiche les nombres du fichier, leur somme et leur moyenne. */
printf("nAffichage tableau passe en parametre : n") ; s = ReadFile(MP_FILE, MTab, nbrec) ;
printf("nnLa somme du tableau est : %dn", s) ; printf("nLa moyenne des nombres est : %dn", s/nbrec) ;
fclose(MP_FILE) ;
printf("nn") ; return 0 ; }
int CntRec(FILE *FP_FILE, int FTab[]) { int i ; int var ; int c ;
while ((c = fgetc(FP_FILE)) != EOF) for (i = 0 ; ((fscanf(FP_FILE, "%d", &var)) != EOF) ; i++) ;
return i ; }
int ReadFile(FILE *FP_FILE, int FTab[], int n) { int var ; int i ; int c ; int s = 0 ;
// Il y a comme un <censure> dans le potage ligne suivante
while ((c = fgetc(FP_FILE)) != EOF) { for (i = 0 ; ((fscanf(FP_FILE, "%d", &var)) != EOF) ; i++) { printf("n%d", var) ; s += var ; } } return s ; }
Merci,
De rien,
JKB
-- Si votre demande me parvient sur carte perforée, je titiouaillerai très volontiers une réponse... => http://grincheux.de-charybde-en-scylla.fr
-ed-
On 18 déc, 20:16, "" wrote:
int ReadFile(FILE *FP_FILE, int FTab[], int n) { int var ; int i ; int c ; int s = 0 ;
while ((c = fgetc(FP_FILE)) != EOF) { for (i = 0 ; ((fscanf(FP_FILE, "% d", &var)) != EOF) ; i++) { printf("n%d", var) ; s += var ; } } return s ;
}
Merci,
Noublie pas que chaque appel à la fonction de lecture (ici, il y en a 2) fait avancer le 'curseur'.... Cette fonction ne fait donc probablement pas ce que tu attends ...
L'usage est d'utiliser une seule fonction de lecture (choisie en fonction du formatage des données) et de tester la valeur retournée pour déterminée la fin de lecture (je pense qu'on te l'a déjà dit 3 000 fois ...)
Je rappelle donc la procédure :
1 - décrire clairement et sans ambiguïté le format des données à lire 2 - choisir la fonction de lecture appropriée :
- par caractères : fgetc() - par ligne : fgets() - par champs clairement identifiés : fscanf(). (Usage délicat) : Attention aux espaces qui sont des séparateurs ... : "Jean" = 1 mot "Jean Paul" = 2 mots.
3 - lire dans une boucle while avec *un seul* appel à la fonction de lecture :
WHILE err = LECTURE (donnees) != FIN Traiter (donnees) END
On 18 déc, 20:16, "bpascal...@googlemail.com"
<bpascal...@googlemail.com> wrote:
int ReadFile(FILE *FP_FILE, int FTab[], int n)
{
int var ;
int i ;
int c ;
int s = 0 ;
while ((c = fgetc(FP_FILE)) != EOF)
{
for (i = 0 ; ((fscanf(FP_FILE, "% d", &var)) != EOF) ; i++)
{
printf("n%d", var) ;
s += var ;
}
}
return s ;
}
Merci,
Noublie pas que chaque appel à la fonction de lecture (ici, il y en a
2) fait avancer le 'curseur'.... Cette fonction ne fait donc
probablement pas ce que tu attends ...
L'usage est d'utiliser une seule fonction de lecture (choisie en
fonction du formatage des données) et de tester la valeur retournée
pour déterminée la fin de lecture (je pense qu'on te l'a déjà dit 3 000
fois ...)
Je rappelle donc la procédure :
1 - décrire clairement et sans ambiguïté le format des données à lire
2 - choisir la fonction de lecture appropriée :
- par caractères : fgetc()
- par ligne : fgets()
- par champs clairement identifiés : fscanf(). (Usage délicat) :
Attention aux espaces qui sont des séparateurs ... : "Jean" = 1 mot
"Jean Paul" = 2 mots.
3 - lire dans une boucle while avec *un seul* appel à la fonction de
lecture :
WHILE err = LECTURE (donnees) != FIN
Traiter (donnees)
END
int ReadFile(FILE *FP_FILE, int FTab[], int n) { int var ; int i ; int c ; int s = 0 ;
while ((c = fgetc(FP_FILE)) != EOF) { for (i = 0 ; ((fscanf(FP_FILE, "% d", &var)) != EOF) ; i++) { printf("n%d", var) ; s += var ; } } return s ;
}
Merci,
Noublie pas que chaque appel à la fonction de lecture (ici, il y en a 2) fait avancer le 'curseur'.... Cette fonction ne fait donc probablement pas ce que tu attends ...
L'usage est d'utiliser une seule fonction de lecture (choisie en fonction du formatage des données) et de tester la valeur retournée pour déterminée la fin de lecture (je pense qu'on te l'a déjà dit 3 000 fois ...)
Je rappelle donc la procédure :
1 - décrire clairement et sans ambiguïté le format des données à lire 2 - choisir la fonction de lecture appropriée :
- par caractères : fgetc() - par ligne : fgets() - par champs clairement identifiés : fscanf(). (Usage délicat) : Attention aux espaces qui sont des séparateurs ... : "Jean" = 1 mot "Jean Paul" = 2 mots.
3 - lire dans une boucle while avec *un seul* appel à la fonction de lecture :
WHILE err = LECTURE (donnees) != FIN Traiter (donnees) END