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,
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
JKB
Le #22939351
Le Sat, 18 Dec 2010 11:16:01 -0800 (PST),
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 #include
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
-ed-
Le #22941201
On 18 déc, 20:16, ""

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
Publicité
Poster une réponse
Anonyme