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

Windows Discussion :

Lire un fichier UTF-8 line par line en C


Sujet :

Windows

  1. #1
    Futur Membre du Club
    Inscrit en
    Août 2009
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 39
    Points : 6
    Points
    6
    Par défaut Lire un fichier UTF-8 line par line en C
    Bonsoir,

    Je veux lire un fichier texte ligne par ligne crée par Notepad code en UTF-8, je veux pas afficher les strings, je veux juste lire est compare.

    Ce code lire un fichier texte ANSI ligne par ligne est comparer.

    Ce que je veux
    • Lire test_ansi.txt ligne par ligne
    • Si ligne = "b" afficher "YES!"
    • Sinon afficher "NO!"


    read_ansi_line_by_line.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
    #include <stdio.h>
    
    int main()
    {
        char *inname = "test_ansi.txt";
        FILE *infile;
        char line_buffer[BUFSIZ]; /* BUFSIZ is defined if you include stdio.h */
        char line_number;
    
        infile = fopen(inname, "r");
        if (!infile) {
            printf("\nfile '%s' not found\n", inname);
            return 0;
        }
        printf("\n%s\n\n", inname);
    
        line_number = 0;
        while (fgets(line_buffer, sizeof(line_buffer), infile)) {
            ++line_number;
            /* note that the newline is in the buffer */
            if (strcmp("b\n", line_buffer) == 0 ){
                printf("%d: YES!\n", line_number);
            }else{
                printf("%d: NO!\n", line_number,line_buffer);
            }
        }
        printf("\n\nTotal: %d\n", line_number);
        return 0;
    }
    test_ansi.txt

    Compiler

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc -o read_ansi_line_by_line read_ansi_line_by_line.c
    Output
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    test_ansi.txt
    
    1: NO!
    2: YES!
    3: NO!
    
    
    Total: 3
    Maintenant j'ai besoin de lire un fichier UTF-8 crée par Notepad, âpre plus que 6 mois de recherche sur l'internet, les forums English et Français et Arabe, j'ai trouver tous les réponse de mes question ici (c'est moi FREESAIF), bravo a tous les professionnels de developpez.com

    Mais jusqu'à aujourd'hui j'ai jamais vu un programme qui bien traiter les informations UTF-8 écrit en C (C99)!, je sais pas exactement pour quoi mais je crois que le Standard C ne support pas Unicode en général alors... un peut difficile!

    LE PROBLÈME!

    Pour lire fichier UTF-8, j'ai besoin de lire fichier en mode binaire!

    Mais comment lire un fichier UTF-8 en mode binaire ?! avec quelle fonctions ?
    Sil-vous-plaît quelqu'un connais une méthode plus simple ?

    Programme écrit en C (C99) qui lire un fichier texte UTF-8 ligne par ligne est qui compare les caractères.

    Merci

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Attends, c'est en UTF-8 ou en UTF-16 (voire UTF-32) ?
    Car lire des wchar_t avec fread(), ça ne ressemble pas à de l'UTF-8...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Futur Membre du Club
    Inscrit en
    Août 2009
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 39
    Points : 6
    Points
    6
    Par défaut
    Bonsoir,

    Oui monsieur Médinoc, tu as raison, j'ai changer titre!, est j'ai chercher sur l'internet pour "UTF-8" sans "Unicode", il y a des solution valide dans MSDN mais ça marche juste pour compilateur du Microsoft!, est je peux pas le utilise avec GCC, mais dans d'autre place j'ai trouver que la solution est de lire fichier UTF-8 en mode binaire.

    Mais comment lire un fichier UTF-8 en mode binaire ?! avec quelle fonctions ?

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Si c'est de l'UTF-8, plutôt que le lire en mode binaire, je te conseille de le lire en mode texte et convertir toi-même les caractères lus en wchar_t, grâce aux algos de décodage UTF-8 que tu pourras trouver sur le net.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Futur Membre du Club
    Inscrit en
    Août 2009
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 39
    Points : 6
    Points
    6
    Par défaut
    Le lire en mode texte, ça veux dire la même exemple que j'ai crée en version WCHAR ?

    Si oui, voila une version qui lire fichier utf-8 en mode texte

    read_utf8_line_by_line.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
    35
    36
    37
    38
    39
    40
    41
    #define UNICODE
    #ifdef UNICODE
    #define _UNICODE
    #else
    #define _MBCS
    #endif
    
    #include <stdio.h>
    #include <wchar.h>
    
    int main()
    {
        wchar_t *inname = L"test_utf8.txt";
        FILE *infile;
        wchar_t line_buffer[BUFSIZ];
        int line_number;
    
        infile = _wfopen(inname, L"r,ccs=UTF-8");
        if (!infile) {
            wprintf(L"\nfile '%s' not found.\n", inname);
            return 0;
        }
        wprintf(L"\nFile: %s\n\n", inname);
    
        line_number = 0;
        while (fgetws(line_buffer, sizeof(line_buffer), infile)) {
            line_number = line_number +1;
    		
    		//#
    		//# ICI ? ? ?
    		//#
    		
            if ( wcscmp ( L"ب" , line_buffer ) == 0 ){
                 wprintf(L"Line%d: YES.\n",line_number);
            }else{
                 wprintf(L"Line%d: NO.\n",line_number , line_buffer);
            }
        }
        fclose(infile);
        return 0;
    }
    test_utf8.txt

    Output

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    File: test_utf8.txt
    
    Line1: NO.
    Line2: NO.
    Line3: NO.
    Sil-vous plaît monsieur Médinoc, ou je mette la conversation ? est la quelle exacte ? MultiByteToWideChar ? est les chars lire depuis fichier son déjà dans quelle type ? est quelle type exacte faut le convertir avant de le compare ?

    Merci

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Non, ça veut dire tu lis toute une ligne normalement comme pour des chars normaux (avec fgets(), quoi), puis tu convertis toute la ligne. Soit manuellement (ce qui peut avoir son intérêt si tu veux spécifiquement de l'UTF-32), soit avec MultiByteToWideChar(), qui va te donner de l'UTF-16.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    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
    Je ne me souviens plus combien de fois déjà on lui a dit ça.

  8. #8
    Futur Membre du Club
    Inscrit en
    Août 2009
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 39
    Points : 6
    Points
    6
    Par défaut
    Voila j'ai fait, mais toujours résultat est <> 0 "NO!"

    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
    #include <windows.h>
    #include <tchar.h>
    #include <stdio.h>
    
    const int BUF_SIZE = 500 ;
    TCHAR Buffer[BUF_SIZE];
    
    int main()
    {
        const char* inname = "test_utf8.txt";
        FILE *infile;
        TCHAR line_buffer[BUFSIZ]; /* BUFSIZ is defined if you include stdio.h */
        TCHAR line_number;
    
        infile = fopen(inname, "r");
        if (!infile) {
            printf("\nfile '%s' not found\n", inname);
            return 0;
        }
        printf("\n%s\n\n", inname);
    
        line_number = 0;
        while (fgets(line_buffer, sizeof(line_buffer), infile)) {
            ++line_number;
    		
    						// get length
    						int nLengthNeeded = MultiByteToWideChar(CP_UTF8,0,Buffer,BUF_SIZE,0,0);	
    						// convert to wide char
    						wchar_t * pWCMessage = new wchar_t[ nLengthNeeded ];
    						MultiByteToWideChar(CP_UTF8,0,Buffer,BUF_SIZE,pWCMessage,nLengthNeeded);
    		
    		if (wcscmp(L"ب", pWCMessage) == 0 ){
                printf("%d: YES!\n", line_number);
            }else{
                printf("%d: NO!\n", line_number,pWCMessage);
            }
        }
        printf("\n\nTotal: %d\n", line_number);
        return 0;
    }
    Si un jour dans votre poste de travaille, chef de votre équipe vous demander de développez une petite tool en C (C99) ou en C++ avec GCC, qui lire un fichier texte UTF-8 ligne par ligne est il comparer les chars est il affiche résultat "Oui" ou "Non".. vous fait quoi ?

  9. #9
    Futur Membre du Club
    Inscrit en
    Août 2009
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 39
    Points : 6
    Points
    6
    Par défaut
    Monsieur Melem,

    il y a des programmeurs ici qui me dire de lire le fichier en mode binaire!
    d'autre me dire lire fichier en mode texte mais avec les fonctions W!
    est d'autre me dire lire fichier en mode texte normal, âpre convertir buffer est comparer!


  10. #10
    Futur Membre du Club
    Inscrit en
    Août 2009
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 39
    Points : 6
    Points
    6
    Par défaut
    Bonsoir les programmeurs,

    Voila j'ai trouver solution a mon probleme, je le partage ici pour ce qu'il intéressé a lire un fichier texte UTF-8 en C99

    Merci a tous les programmeurs ici qui ma aider

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    void ReadUTF8(FILE* fp)
    {
        unsigned char iobuf[255] = {0};
        while( fgets((char*)iobuf, sizeof(iobuf), fp) )
        {
                size_t len = strlen((char *)iobuf);
                if(len > 1 &&  iobuf[len-1] == '\n')
                    iobuf[len-1] = 0;
                len = strlen((char *)iobuf);
                printf("(%d) \"%s\"  ", len, iobuf);
                if( iobuf[0] == '\n' )
                    printf("Yes\n");
                else
                    printf("No\n");
        }
    }
    
    void ReadUTF16BE(FILE* fp)
    {
    }
    
    void ReadUTF16LE(FILE* fp)
    {
    }
    
    int main()
    {
        FILE* fp = fopen("test_utf8.txt", "r");
        if( fp != NULL)
        {
            // see http://en.wikipedia.org/wiki/Byte-order_mark for explaination of the BOM
            // encoding
            unsigned char b[3] = {0};
            fread(b,1,2, fp);
            if( b[0] == 0xEF && b[1] == 0xBB)
            {
                fread(b,1,1,fp); // 0xBF
                ReadUTF8(fp);
            }
            else if( b[0] == 0xFE && b[1] == 0xFF)
            {
                ReadUTF16BE(fp);
            }
            else if( b[0] == 0 && b[1] == 0)
            {
                fread(b,1,2,fp); 
                if( b[0] == 0xFE && b[1] == 0xFF)
                    ReadUTF16LE(fp);
            }
            else
            {
                // we don't know what kind of file it is, so assume its standard
                // ascii with no BOM encoding
                rewind(fp);
                ReadUTF8(fp);
            }
        }        
    
        fclose(fp);
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 9
    Dernier message: 03/07/2014, 18h08
  2. Réponses: 7
    Dernier message: 17/04/2013, 22h26
  3. [WD12] Lire un fichier UTF-8
    Par MicaelFelix dans le forum WinDev
    Réponses: 5
    Dernier message: 17/11/2009, 06h08
  4. lire un fichier de string ligne par ligne
    Par bilzzbenzbilz dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 11/02/2009, 10h44
  5. Comment lire un fichier DB en cours d'utilisation par 1 autr
    Par jbat dans le forum Bases de données
    Réponses: 4
    Dernier message: 12/03/2004, 11h06

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