Précédent   Forum du club des développeurs et IT Pro > C et C++ > C > Contribuez
Contribuez Proposez vos articles, cours, tutoriels, FAQ, sources, et autres ressources pour la rubrique C.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 08/05/2009, 23h53   #1
Klyne2
Membre régulier
 
Homme
Développeur Web
Inscription : janvier 2009
Messages : 100
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 25
Localisation : Belgique

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : janvier 2009
Messages : 100
Points : 85
Points : 85
Par défaut Afficher un fichier à l'écran sans en connaître sa taille

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

lireFile.c
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <stdio.h>
 
void afficherFichier();
 
void main(void)
{
	afficherFichier();
}
 
void afficherFichier()
{
	int c;
	FILE * fichier;
 
	// fichier en lecture seule ; le nom peut etre toto.txt (p.ex)
	fichier = fopen("document.txt", "rb");
	// Si le fichier n'existe pas...
	if (!fichier)
		printf("ERREUR - Fichier inexistant\n");
	// Sinon...
	else
	{
		// On se place au début du fichier.
		fseek(fichier, 0L, SEEK_SET);
 
		// Tant qu'on ne rencontre pas la fin du fichier, on lit un caractère...
		while ((c = getc(fichier)) != EOF)  // ou encore   while (!feof(fichier))
			// Que l'on affiche à l'écran
			printf("%c", c);
 
      // Et on oublie pas de fermer le fichier.
		fclose(fichier);
	}
}
document.txt (qui est dans le dossier racine de lireFile.c)

Code :
1
2
3
4
5
6
7
8
9
Le Lorem Ipsum est simplement du faux texte employé dans la composition et la m
ise en page avant impression. Le Lorem Ipsum est le faux texte standard de l'im
primerie depuis les années 1500, quand un peintre anonyme assembla ensemble des
morceaux de texte pour réaliser un livre spécimen de polices de texte. Il n'a 
pas fait que survivre cinq siècles, mais s'est aussi adapté à la bureautique 
informatique, sans que son contenu n'en soit modifié. Il a été popularisé dans 
les années 1960 grâce à la vente de feuilles Letraset contenant des passages 
du Lorem Ipsum, et, plus récemment, par son inclusion dans des applications de 
mise en page de texte, comme Aldus PageMaker.
La structure de mon fichier est dû à la limitation de la fenêtre DOS ;)

Le fichier ZIP: les deux fichiers.
Fichiers attachés
Type de fichier : zip lireFile.zip (1,0 Ko, 0 affichages)
Klyne2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/05/2009, 11h52   #2
Invité(e)
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
Bonjour,

Deux trois détails me chiffonnent :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <stdio.h>
 
#define NOM_FICHIER "document.txt"
 
void afficherFichier(void);
 
/* main est de type int */
int main(void)
{
    afficherFichier();
    return 0;
}
 
void afficherFichier(void)
{
    /* fichier en lecture seule ; le nom peut etre toto.txt (p.ex) */
    /* ouverture en mode texte, pas binaire */
    FILE * fichier = fopen(NOM_FICHIER, "r");
 
    if (fichier == NULL) 
    {
        /* l'ouverture a echoue*/
        perror(NOM_FICHIER);
    }
    else
    {
        /* fichier ouvert */
 
        int c = fgetc(fichier);
 
        /* Tant qu'on ne rencontre pas la fin du fichier, on lit un caractère... */
        while(c != EOF) {
            /* Que l'on affiche à l'écran */
            fputc(c, stdout);
            c = fgetc(fichier);
        }
 
        /* Et on oublie pas de fermer le fichier. */
        fclose(fichier);
    }
}
  Envoyer un message privé Réponse avec citation 00
Vieux 09/05/2009, 12h05   #3
Klyne2
Membre régulier
 
Homme
Développeur Web
Inscription : janvier 2009
Messages : 100
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 25
Localisation : Belgique

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : janvier 2009
Messages : 100
Points : 85
Points : 85
Bonjour mabu !

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

Pour le #define du document, c'est une bonne idée. A la base, je voulais généralisé la fonction et lui passer en paramètre la chaine de caractères étant le fichier (mais je me suis pris la tête 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 préciser une interrogation que je me pose: quel est la différence significative entre l'ouverture en binaire ou en texte, dans le cas présent ?

Quant à l'utilisation de perror(), certes on obtient une erreur plus précise 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 détail que je ne connais pas, ce n'est donc qu'une question pour m'informer )
Klyne2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/05/2009, 14h28   #4
koala01
Modérateur
 
Avatar de koala01
 
Philippe Dunski
Inscription : octobre 2004
Messages : 8 616
Détails du profil
Informations personnelles :
Nom : Philippe Dunski
Âge : 41

Informations forums :
Inscription : octobre 2004
Messages : 8 616
Points : 13 293
Points : 13 293
Envoyer un message via MSN à koala01 Envoyer un message via Skype™ à koala01
Salut,
Citation:
Envoyé par Klyne2 Voir le message
Bonjour mabu !

Pour le #define du document, c'est une bonne idée. A la base, je voulais généralisé la fonction et lui passer en paramètre la chaine de caractères étant le fichier (mais je me suis pris la tête dessus et je l'ai fait au plus simple !)
C'est pourtant simple: tu transmet une chaine de caractères en argument à ta fonction, et tu l'utilise comme nom de fichier (il faut juste s'assurer que la chaine passée en paramètre est bel et bien terminée par '\0'):
Code :
1
2
3
4
5
void afficher(char* filename)
{
    FILE * fichier = fopen(filename, "r");
    /* la suite */
}
Evidemment, il faut demander ce nom dans la fonction main, ou la récupérer en tant que paramètre de l'application
Citation:
L'ouverture, je suis d'accord. C'est du texte, donc ouverture en mode texte. Mais peut-tu par hasard me préciser une interrogation que je me pose: quel est la différence significative entre l'ouverture en binaire ou en texte, dans le cas présent ?
Le fait est que, lorsque tu ouvre un fichier en mode binaire, c'est parce que tu envisage de gérer les données lues comme des données brutes (tu n'est pas sur que ce que tu va lire sera bel et bien des caractères "affichables")...

C'est, le cas pour tout ce qui est fichiers compressés et fichier de format particulier
Citation:
Quant à l'utilisation de perror(), certes on obtient une erreur plus précise 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 réellement un problème 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 Molière
__________________
A méditer: La solution la plus simple est toujours la moins compliquée
Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
Compiler Gcc sous windows avec MinGW
je ne répondrai à aucune question technique par E-mail, message visiteur ou message privé
Vous avez obtenu votre réponse pensez au bouton en bas de page
koala01 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/05/2009, 14h31   #5
Klyne2
Membre régulier
 
Homme
Développeur Web
Inscription : janvier 2009
Messages : 100
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 25
Localisation : Belgique

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : janvier 2009
Messages : 100
Points : 85
Points : 85
Merci pour ces précisions

Pour ce qui est du message d'erreur, c'est préférable Et c'est juste un contrôle 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 numéro d'erreur, et donc l'utiliser pour différentes langues.
Klyne2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/05/2009, 23h16   #6
Invité(e)
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
Citation:
Envoyé par Klyne2 Voir le message
En ce qui concerne la fonction main, il est vrai que un retour entier aurait été plus académique ; mais ce n'est pas important (du moins, pas dans les labos que j'ai pu réaliser).
Je ne suis pas d'accord, une fonction main mal typée, c'est un comportement indéfini.

Citation:
Envoyé par Klyne2 Voir le message
Quant à l'utilisation de perror(), certes on obtient une erreur plus précise 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 système utilisé.
Et perror est définie dans stdio.h.

Citation:
Envoyé par Klyne2 Voir le message
Petite question: l'utilisation de fputc() au lieu de printf(), pourquoi ? (certes un détail que je ne connais pas, ce n'est donc qu'une question pour m'informer )
fputc permet d'écrire un caractère dans le flux donné.
printf permet de formater des données avant affichage.

Pour écrire un caractère 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 paramètres avant de les écrire.
  Envoyer un message privé Réponse avec citation 00
Vieux 11/05/2009, 15h03   #7
Klyne2
Membre régulier
 
Homme
Développeur Web
Inscription : janvier 2009
Messages : 100
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 25
Localisation : Belgique

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : janvier 2009
Messages : 100
Points : 85
Points : 85
Merci pour toutes ces précisions, encore une fois.

Et désolé 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 français, le compilateur en anglais ; ça vient surement de là. Mais bon, ce n'est pas trop un soucis !
Klyne2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/05/2009, 09h32   #8
Vincent Rogier
Rédacteur/Modérateur
 
Avatar de Vincent Rogier
 
vincent rogier
Inscription : juillet 2007
Messages : 2 366
Détails du profil
Informations personnelles :
Nom : vincent rogier
Âge : 35

Informations forums :
Inscription : juillet 2007
Messages : 2 366
Points : 4 881
Points : 4 881
Lire un fichier caractère par caractère ?

Sérieusement, pour l'afficher entier sur la console, quel est l'intérêt ?
Surtout dans une FAQ, c'est aberrant !
__________________
Vincent Rogier.

Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

OCILIB (C Driver for Oracle)

Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle
Vincent Rogier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/05/2009, 11h39   #9
Klyne2
Membre régulier
 
Homme
Développeur Web
Inscription : janvier 2009
Messages : 100
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 25
Localisation : Belgique

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : janvier 2009
Messages : 100
Points : 85
Points : 85
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 données là où il faut par la suite. Ca permet une chose: la traduction du graphisme.

- après, on peut y voir beaucoup d'applications, ... et puis, ce n'était pas une question que je me posais, puisque je me l'étais posée et ainsi, si quelqu'un veut savoir comment on fait, ça reste dans le forum
Klyne2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/05/2009, 13h57   #10
Melem
Rédacteur/Modérateur
 
Avatar de Melem
 
Homme Jessee Michaël Christian Edouard
Ingénieur développement logiciels
Inscription : janvier 2006
Messages : 3 661
Détails du profil
Informations personnelles :
Nom : Homme Jessee Michaël Christian Edouard
Âge : 27
Localisation : France, Essonne (Île de France)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Électronique et micro-électronique

Informations forums :
Inscription : janvier 2006
Messages : 3 661
Points : 8 435
Points : 8 435
Envoyer un message via MSN à Melem
Deux petites remarques supplémentaires sur le code original :

- Attention à while (!feof(fichier)) { ... }, ce n'est pas une bonne méthode pour parcourir un fichier caractère par caractère. Explications dans la FAQ.
- fseek est inutile car il est garanti qu'à l'ouverture d'un fichier, le pointeur de position courante pointe le début du fichier si ce dernier a été ouvert en mode "r", "w" et leurs dérivés.

Ensuite, je crois qu'on a déjà un programme similaire dans nos pages "sources" et ça ne m'étonnerait pas non plus de retrouver ce même 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+.
Melem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/05/2009, 11h25   #11
Klyne2
Membre régulier
 
Homme
Développeur Web
Inscription : janvier 2009
Messages : 100
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 25
Localisation : Belgique

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : janvier 2009
Messages : 100
Points : 85
Points : 85
Je prends bonne notes de toutes les remarques et je change le code que j'utilise pour mieux, ainsi
Klyne2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 22h15.


 
 
 
 
Partenaires

Hébergement Web