rewind et fseek ne revienne pas au début du fichier
Le
bpascal123
Bonjour cyberspace,
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
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
/*
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.
*/
#include <stdio.h> /* printf getchar getc fopen fclose */
#include <stdlib.h> /* exit */
int CntRec(FILE *FP_FILE, int FTab[]) ;
int ReadFile(FILE *FP_FILE, int FTab[], int n) ;
#define NBMAX 20 /* nbr de chiffre max */
int main(void)
{
FILE *MP_FILE = NULL ;
char FileName[] = "/media/DOC2/code_c/nbr.txt" ;
int MTab[NBMAX] ;
int nbrec = 0 ;
int i ;
int s, m ;
if ((MP_FILE = fopen(FileName, "r")) == NULL)
{
printf("Erreur ouverture de fichier.") ;
exit(EXIT_FAILURE) ;
}
nbrec = CntRec(MP_FILE, MTab) ;
printf("Test 1 : %d", nbrec) ;
/*fseek(MP_FILE, 0L, 0) ;*/
rewind(MP_FILE) ;
printf("Affichage tableau passe en parametre : ") ;
s = ReadFile(MP_FILE, MTab, nbrec) ;
printf("La somme du tableau est : %d", s) ;
printf("La moyenne des nombres est : %d", s/nbrec) ;
fclose(MP_FILE) ;
printf("") ;
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 ;
while ((c = fgetc(FP_FILE)) != EOF)
{
for (i = 0 ; ((fscanf(FP_FILE, "%d", &var)) != EOF) ; i++)
{
printf("%d", var) ;
s += var ;
}
}
return s ;
}
Merci,
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
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
/*
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.
*/
#include <stdio.h> /* printf getchar getc fopen fclose */
#include <stdlib.h> /* exit */
int CntRec(FILE *FP_FILE, int FTab[]) ;
int ReadFile(FILE *FP_FILE, int FTab[], int n) ;
#define NBMAX 20 /* nbr de chiffre max */
int main(void)
{
FILE *MP_FILE = NULL ;
char FileName[] = "/media/DOC2/code_c/nbr.txt" ;
int MTab[NBMAX] ;
int nbrec = 0 ;
int i ;
int s, m ;
if ((MP_FILE = fopen(FileName, "r")) == NULL)
{
printf("Erreur ouverture de fichier.") ;
exit(EXIT_FAILURE) ;
}
nbrec = CntRec(MP_FILE, MTab) ;
printf("Test 1 : %d", nbrec) ;
/*fseek(MP_FILE, 0L, 0) ;*/
rewind(MP_FILE) ;
printf("Affichage tableau passe en parametre : ") ;
s = ReadFile(MP_FILE, MTab, nbrec) ;
printf("La somme du tableau est : %d", s) ;
printf("La moyenne des nombres est : %d", s/nbrec) ;
fclose(MP_FILE) ;
printf("") ;
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 ;
while ((c = fgetc(FP_FILE)) != EOF)
{
for (i = 0 ; ((fscanf(FP_FILE, "%d", &var)) != EOF) ; i++)
{
printf("%d", var) ;
s += var ;
}
}
return s ;
}
Merci,

Poser une question


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.
Pourtant fseek() et rewind() à font bien ce que tu leur demandes. Le
problème n'est pas là.
M'étonnerais, ça. Regarde un peu comment tu lis ton fichier.
// Il y a comme un <censure> dans le potage ligne suivante
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
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