IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Contribuez Discussion :

Afficher un fichier à l'écran sans en connaître sa taille [FAQ]


Sujet :

Contribuez

  1. #1
    Membre régulier

    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2009
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

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

    Informations forums :
    Inscription : Janvier 2009
    Messages : 99
    Points : 115
    Points
    115
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 Fichiers attachés

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,

    Deux trois détails me chiffonnent :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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);
        }
    }

  3. #3
    Membre régulier

    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2009
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

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

    Informations forums :
    Inscription : Janvier 2009
    Messages : 99
    Points : 115
    Points
    115
    Par défaut
    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 )

  4. #4
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 612
    Points : 30 611
    Points
    30 611
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    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
    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
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    Membre régulier

    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2009
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

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

    Informations forums :
    Inscription : Janvier 2009
    Messages : 99
    Points : 115
    Points
    115
    Par défaut
    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.

  6. #6
    Invité(e)
    Invité(e)
    Par défaut
    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.

  7. #7
    Membre régulier

    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2009
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

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

    Informations forums :
    Inscription : Janvier 2009
    Messages : 99
    Points : 115
    Points
    115
    Par défaut
    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 !

  8. #8
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Points : 5 307
    Points
    5 307
    Par défaut
    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

  9. #9
    Membre régulier

    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2009
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

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

    Informations forums :
    Inscription : Janvier 2009
    Messages : 99
    Points : 115
    Points
    115
    Par défaut
    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

  10. #10
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    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 656
    Points : 8 389
    Points
    8 389
    Par défaut
    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+.

  11. #11
    Membre régulier

    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2009
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

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

    Informations forums :
    Inscription : Janvier 2009
    Messages : 99
    Points : 115
    Points
    115
    Par défaut
    Je prends bonne notes de toutes les remarques et je change le code que j'utilise pour mieux, ainsi

Discussions similaires

  1. Réponses: 5
    Dernier message: 15/05/2008, 13h52
  2. Ouvrir et afficher un fichier sans extansion connue
    Par smartclip dans le forum VB.NET
    Réponses: 8
    Dernier message: 04/02/2008, 14h15
  3. afficher un fichier excel sans le Excel Viewer de MS
    Par nutix2003 dans le forum Documents
    Réponses: 5
    Dernier message: 26/07/2007, 10h22
  4. Réponses: 1
    Dernier message: 01/06/2006, 10h11
  5. [Image] Afficher image récupérée par FTP sans fichier temporaire
    Par grinder59 dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 18/05/2006, 10h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo