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

rewind et fseek ne revienne pas au début du fichier

2 réponses
Avatar
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.
*/

#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 =3D NULL ;
char FileName[] =3D "/media/DOC2/code_c/nbr.txt" ;
int MTab[NBMAX] ;
int nbrec =3D 0 ;
int i ;
int s, m ;

if ((MP_FILE =3D fopen(FileName, "r")) =3D=3D NULL)
{
printf("\nErreur ouverture de fichier.\n") ;
exit(EXIT_FAILURE) ;
}

nbrec =3D CntRec(MP_FILE, MTab) ;
printf("\nTest 1 : %d\n", nbrec) ;

/*fseek(MP_FILE, 0L, 0) ;*/
rewind(MP_FILE) ;

printf("\nAffichage tableau passe en parametre : \n") ;
s =3D ReadFile(MP_FILE, MTab, nbrec) ;

printf("\n\nLa somme du tableau est : %d\n", s) ;
printf("\nLa moyenne des nombres est : %d\n", s/nbrec) ;

fclose(MP_FILE) ;

printf("\n\n") ;
return 0 ;
}

int CntRec(FILE *FP_FILE, int FTab[])
{
int i ;
int var ;
int c ;

while ((c =3D fgetc(FP_FILE)) !=3D EOF)
for (i =3D 0 ; ((fscanf(FP_FILE, "%d", &var)) !=3D EOF) ; i++)
;

return i ;
}

int ReadFile(FILE *FP_FILE, int FTab[], int n)
{
int var ;
int i ;
int c ;
int s =3D 0 ;

while ((c =3D fgetc(FP_FILE)) !=3D EOF)
{
for (i =3D 0 ; ((fscanf(FP_FILE, "%d", &var)) !=3D EOF) ; i++)
{
printf("\n%d", var) ;
s +=3D var ;
}
}
return s ;
}



Merci,

2 réponses

Avatar
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.
*/

#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("nErreur ouverture de fichier.n") ;
exit(EXIT_FAILURE) ;
}

nbrec = CntRec(MP_FILE, MTab) ;
printf("nTest 1 : %dn", nbrec) ;

/*fseek(MP_FILE, 0L, 0) ;*/
rewind(MP_FILE) ;

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
Avatar
-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