+ Répondre à la discussion
Affichage des résultats 1 à 10 sur 10
  1. #1
    Invité de passage
    Inscrit en
    août 2009
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : août 2009
    Messages : 39
    Points : 2
    Points
    2

    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 :
    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 :
    gcc -o read_ansi_line_by_line read_ansi_line_by_line.c
    Output
    Code :
    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 Confirmé Sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    septembre 2005
    Messages
    24 349
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France

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

    Informations forums :
    Inscription : septembre 2005
    Messages : 24 349
    Points : 34 763
    Points
    34 763

    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
    Invité de passage
    Inscrit en
    août 2009
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : août 2009
    Messages : 39
    Points : 2
    Points
    2

    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 Confirmé Sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    septembre 2005
    Messages
    24 349
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France

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

    Informations forums :
    Inscription : septembre 2005
    Messages : 24 349
    Points : 34 763
    Points
    34 763

    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
    Invité de passage
    Inscrit en
    août 2009
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : août 2009
    Messages : 39
    Points : 2
    Points
    2

    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 :
    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 :
    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 Confirmé Sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    septembre 2005
    Messages
    24 349
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France

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

    Informations forums :
    Inscription : septembre 2005
    Messages : 24 349
    Points : 34 763
    Points
    34 763

    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 Confirmé Sénior

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    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 173
    Points
    8 173

    Par défaut

    Je ne me souviens plus combien de fois déjà on lui a dit ça.

  8. #8
    Invité de passage
    Inscrit en
    août 2009
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : août 2009
    Messages : 39
    Points : 2
    Points
    2

    Par défaut

    Voila j'ai fait, mais toujours résultat est <> 0 "NO!"

    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
    #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
    Invité de passage
    Inscrit en
    août 2009
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : août 2009
    Messages : 39
    Points : 2
    Points
    2

    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
    Invité de passage
    Inscrit en
    août 2009
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : août 2009
    Messages : 39
    Points : 2
    Points
    2

    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 :
    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.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •