# C et C++ > C > Contribuez >  Afficher un fichier  l'cran sans en connatre sa taille [FAQ]

## Klyne2

Imaginons que l'on veuille afficher l'ensemble du contenu d'un fichier sans pour autant connatre la taille du fichier ou encore l'avoir construit selon une structure particulire (ce qui serait le cas pour un fichier de gestion de clients, par exemple).

*lireFile.c*


```

```

*document.txt* (qui est dans le dossier racine de lireFile.c)



```

```

La structure de mon fichier est d  la limitation de la fentre DOS ;)

Le fichier ZIP: les deux fichiers.

----------


## Invit(e)

Bonjour,

Deux trois dtails me chiffonnent :



```

```

----------


## Klyne2

Bonjour *mabu* !

En ce qui concerne la fonction *main*, il est vrai que un retour entier aurait t plus acadmique ; mais ce n'est pas important (du moins, pas dans les labos que j'ai pu raliser).

Pour le *#define* du document, c'est une bonne ide. A la base, je voulais gnralis la fonction et lui passer en paramtre la chaine de caractres tant le fichier (mais je me suis pris la tte dessus et je l'ai fait au plus simple !)

L'*ouverture*, je suis d'accord. C'est du texte, donc ouverture en mode texte. Mais peut-tu par hasard me prciser une interrogation que je me pose: quel est la diffrence significative entre l'ouverture en binaire ou en texte, dans le cas prsent ?

Quant  l'utilisation de *perror()*, certes on obtient une erreur plus prcise mais... en anglais (mon programme tant destin  des utilisateurs FR - logiquement). De plus, il ne faut pas oublier l'inclusion de *errno.h*, alors !

Petite question: l'utilisation de *fputc()* au lieu de printf(), pourquoi ? (certes un dtail que je ne connais pas, ce n'est donc qu'une question pour m'informer  ::): )

----------


## koala01

Salut,



> Bonjour *mabu* !
> 
> Pour le *#define* du document, c'est une bonne ide. A la base, je voulais gnralis la fonction et lui passer en paramtre la chaine de caractres tant le fichier (mais je me suis pris la tte dessus et je l'ai fait au plus simple !)


C'est pourtant simple: tu transmet une chaine de caractres en argument  ta fonction, et tu l'utilise comme nom de fichier (il faut juste s'assurer que la chaine passe en paramtre est bel et bien termine par '\0'):


```

```

Evidemment, il faut demander ce nom dans la fonction main, ou la rcuprer en tant que paramtre de l'application  :;): 



> L'*ouverture*, je suis d'accord. C'est du texte, donc ouverture en mode texte. Mais peut-tu par hasard me prciser une interrogation que je me pose: quel est la diffrence significative entre l'ouverture en binaire ou en texte, dans le cas prsent ?


Le fait est que, lorsque tu ouvre un fichier en mode binaire, c'est parce que tu envisage de grer les donnes lues comme des donnes brutes (tu n'est pas sur que ce que tu va lire sera bel et bien des caractres "affichables")...

C'est, le cas pour tout ce qui est fichiers compresss et fichier de format particulier  :;): 



> Quant  l'utilisation de *perror()*, certes on obtient une erreur plus prcise mais... en anglais (mon programme tant destin  des utilisateurs FR - logiquement). De plus, il ne faut pas oublier l'inclusion de *errno.h*, alors !


Est-ce que ca pose rellement un problme si, en cas d'erreur (et encore faut il qu'il en survienne une) un malheureux message se trouve tre dans la langue de Shakespeare au lieu de celle de Molire  ::question::

----------


## Klyne2

Merci pour ces prcisions  ::): 

Pour ce qui est du message d'erreur, c'est prfrable  ::):  Et c'est juste un contrle basique, que j'ai voulu mettre. Concernant la source ici, oui, ce n'est pas grave  :;): 

Je pense d'ailleurs qu'on sait obtenir le numro d'erreur, et donc l'utiliser pour diffrentes langues.

----------


## Invit(e)

> En ce qui concerne la fonction *main*, il est vrai que un retour entier aurait t plus acadmique ; mais ce n'est pas important (du moins, pas dans les labos que j'ai pu raliser).


Je ne suis pas d'accord, une fonction main mal type, c'est un comportement indfini.




> Quant  l'utilisation de *perror()*, certes on obtient une erreur plus prcise mais... en anglais (mon programme tant destin  des utilisateurs FR - logiquement). De plus, il ne faut pas oublier l'inclusion de *errno.h*, alors !


Il me semble que _perror_ s'adapte  la langue du systme utilis.
Et _perror_ est dfinie dans stdio.h.




> Petite question: l'utilisation de *fputc()* au lieu de printf(), pourquoi ? (certes un dtail que je ne connais pas, ce n'est donc qu'une question pour m'informer )


fputc permet d'crire un caractre dans le flux donn.
printf permet de formater des donnes avant affichage.

Pour crire un caractre dans un flux, il est plus simple de passer par fputc qui est plus ou moins direct que par printf("%c", ...) qui va analyser les paramtres avant de les crire.

----------


## Klyne2

Merci pour toutes ces prcisions, encore une fois.

Et dsol pour mes quelques remarques fautives, je ne sais d'ailleurs pas pourquoi mon aide m'a fournit que c'tait errno.h mais bon...

Quant  la langue, c'est possible... mais mon OS est en franais, le compilateur en anglais ; a vient surement de l. Mais bon, ce n'est pas trop un soucis !

----------


## Vincent Rogier

Lire un fichier caractre par caractre ?

Srieusement, pour l'afficher entier sur la console, quel est l'intrt ? 
Surtout dans une FAQ, c'est aberrant !

----------


## Klyne2

Ca peut servir - du moins dans mon cas -  deux choses, par exemple:

- l'affichage d'un fichier texte quelconque tel qu'un journal d'erreurs.
- l'affichage d'un fichier texte d'extension tpl (en fait, peu importe l'extension) comprenant la partie graphique du programme. Imaginons, je veux faire un listing des clients, j'affiche mon fichier sur la console et j'y place les donnes l o il faut par la suite. Ca permet une chose: la traduction du graphisme. 

- aprs, on peut y voir beaucoup d'applications, ... et puis, ce n'tait pas une question que je me posais, puisque je me l'tais pose et ainsi, si quelqu'un veut savoir comment on fait, a reste dans le forum  ::):

----------


## Melem

Deux petites remarques supplmentaires sur le code original :

- Attention  while (!feof(fichier)) { ... }, ce n'est pas une bonne mthode pour parcourir un fichier caractre par caractre. Explications dans la FAQ.
- fseek est inutile car il est garanti qu' l'ouverture d'un fichier, le pointeur de position courante pointe le dbut du fichier si ce dernier a t ouvert en mode "r", "w" et leurs drivs.

Ensuite, je crois qu'on a dj un programme similaire dans nos pages "sources" et a ne m'tonnerait pas non plus de retrouver ce mme programme dans nos cours et tutoriels de langage C.

Conclusion : c'est beau, c'est utile, mais t'arrives un peu trop tard :p  ::): .

A+.

----------


## Klyne2

Je prends bonne notes de toutes les remarques et je change le code que j'utilise pour mieux, ainsi  ::):

----------

