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

C Discussion :

Lire un fichier encodé en ansi sous linux


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 227
    Par défaut Lire un fichier encodé en ansi sous linux
    Bonjour a tous,

    je suis entrain de réaliser un programme et j'ai un soucis de lécture , j'ai un fichier encodé en ANSI et je n'arrive pas à le lire correctement dans mon programme (linux)

    voila ma fonction :

    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
    int     parsing_data(t_data *data)
    {
      wchar_t **tmp = NULL;
      wchar_t       line[MAX_LEN_CONFIG] = {0};
      FILE  *file = NULL;
     
      printf("on ouvre le fichier [%s]\n", data->path);
      if ((file = fopen(data->path, "r,ccs=UNICODE")) == NULL)
        return (log_std_error(data->path, -1, LOG, "ERROR", 1));
      printf("ouverture OK\n");
      while (fgetws(line, MAX_LEN_CONFIG, file) != NULL)
        {
          printf("[%ls]\n", line);
        }
       return 1;
    }
    J'ai essayer sa aussi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      if ((file = fopen(data->path, "r")) == NULL)
    je n'ai aucune ligne qui s'affiche , je pense que c'est un soucis d'encodage , le programme passe une fois dans la boucle et en sort pourtant il y a plusieurs ligne dans le fichier.

  2. #2
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Pourquoi lire des wchar_t?

  3. #3
    Membre Expert
    Homme Profil pro
    sans emploi
    Inscrit en
    Janvier 2014
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2014
    Messages : 539
    Par défaut
    Bonjour,

    Citation Envoyé par leternel Voir le message
    Pourquoi lire des wchar_t?
    Si on ouvre un fichier avec l'option ccs alors les opérations sur le fichier seront faites en mode wide → il faut utiliser des wchar_t.

    Citation Envoyé par vodkline Voir le message
    Bonjour a tous,

    je suis entrain de réaliser un programme et j'ai un soucis de lécture , j'ai un fichier encodé en ANSI et je n'arrive pas à le lire correctement dans mon programme (linux)

    voila ma fonction :

    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
    int     parsing_data(t_data *data)
    {
      wchar_t **tmp = NULL;
      wchar_t       line[MAX_LEN_CONFIG] = {0};
      FILE  *file = NULL;
     
      printf("on ouvre le fichier [%s]\n", data->path);
      if ((file = fopen(data->path, "r,ccs=UNICODE")) == NULL)
        return (log_std_error(data->path, -1, LOG, "ERROR", 1));
      printf("ouverture OK\n");
      while (fgetws(line, MAX_LEN_CONFIG, file) != NULL)
        {
          printf("[%ls]\n", line);
        }
       return 1;
    }
    J'ai essayer sa aussi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      if ((file = fopen(data->path, "r")) == NULL)
    je n'ai aucune ligne qui s'affiche , je pense que c'est un soucis d'encodage , le programme passe une fois dans la boucle et en sort pourtant il y a plusieurs ligne dans le fichier.
    Je vais supposer que l'encodage de ton fichier est en WINDOWS-1252 (page de code windows pour le français). Si tel est le cas la première chose à faire est de donner le bon encodage à l'option ccs. Au lieu de fopen(data->path, "r,ccs=UNICODE") un fopen(data->path, "r,ccs=WINDOWS-1252") est certainement plus adapté.

    Ensuite, il faut que tu initialises la locale avec la fonction setlocale et il va falloir choisir entre les *printf et les w*printf. Tu ne peux pas utiliser les deux à la fois. L'orientation (wide ou non wide) est déterminé par le premier accès.

    Grossièrement en mode quick and dirty ça peut ressembler à, avec un stdout en mode non wide
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <wchar.h>
    #include <locale.h>
     
    int main(void)
    {
      setlocale(LC_ALL,"");
      printf("START\n");
      FILE *file=fopen("test.win1252","r,ccs=WINDOWS-1252");
      if (!file) {
        perror("fopen");
        exit(EXIT_FAILURE);
      }
      wchar_t line[10000];
      int i=0;
      while (fgetws(line, 10000, file)) {
        printf("line %d\t", ++i);
        printf("[%ls]\n", line);
      }
      fclose(file);
      printf("END");
     
      return 0;
    }
    ou en mode wide
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <wchar.h>
    #include <locale.h>
     
    int main(void)
    {
      setlocale(LC_ALL,"");
      wprintf(L"START\n");
      FILE *file=fopen("test.win1252","r,ccs=WINDOWS-1252");
      if (!file) {
        perror("fopen");
        exit(EXIT_FAILURE);
      }
      wchar_t line[10000];
      int i=0;
      while (fgetws(line, 10000, file)) {
        wprintf(L"line %d\t", ++i);
        wprintf(L"[%ls]\n", line);
      }
      fclose(file);
      wprintf(L"END");
     
      return 0;
    }
    Sinon il y a d'autres solutions → utiliser iconv directement dans le code, l'utiliser en ligne de commande, …

    Edit: attention au CRLF, ils vont rester tels quels …

Discussions similaires

  1. [ODBC] Fichier access et odbc sous linux en php
    Par jejeman dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 01/10/2012, 18h11
  2. Réponses: 2
    Dernier message: 28/02/2010, 19h19
  3. Nombre de fichier maximum par répertoire sous Linux et Windows
    Par juju034 dans le forum Administration système
    Réponses: 4
    Dernier message: 30/06/2008, 16h22
  4. Lire un fichier encodé en UNICODE
    Par loman02 dans le forum XML
    Réponses: 9
    Dernier message: 16/02/2007, 18h19
  5. Lire un fichier situé dans 2 sous dossier...
    Par Pleymo dans le forum Langage
    Réponses: 10
    Dernier message: 08/12/2005, 09h30

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