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 fichier ascii


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2007
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 59
    Par défaut lire fichier ascii
    bonjour,

    Je suis débutante en C, j'essaye de lire un fichier ascii.
    Je travaille sur un mainframe MVS et quand je transfert des fichiers vers ma machine USS, ces fichiers sont codés en EBCEDIC je les convertit alors en ASCII (commande iconv) mais apres comment je fais pour lire ces fichiers là par un programme en C?
    Au fait, je dois lire les 3 premières lignes et vérifier qu'ils commencent par une chaine fixe "prefix" (par exemple) en plus que je dois sauvegarder le texte de la ligne 2 de la colonne 12 jusqu'au caractère ' ' (espace).

    j'ouvre le fichier en mode binaire fopen (file, "rb");
    char *prefix = "PREFIX";
    puis j'utilise fgets(file, ligne_lue) //ligne_lue est un char *
    printf(ligne_lue);
    puis je compare if(strncmp(ligne_lue, prefix, strlen(prefix))==0)...

    Résultats: le printf donne un résultat bizarre
    le premier if n'est jamais vérifié donc il sort en erreur.

    Questions:
    est ce que mon code est bon?
    est ce que l'utilisation de fread() me donnerai un autre résultat?
    pourraije convertir mon prefix en ascii ? si oui comment (quelle est la fonction qui le fait) ? et comment comparer deux chaines ascii et estraire l'information de la ligne 2?
    comment je fais?

    Merci d'avance
    ... // et ainsi de suite (comme un text normal)

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 483
    Par défaut
    Bonjour,

    Merci de toujours utiliser les balises [ CODE ] (le bouton « # ») lorsque tu postes un extrait de ton code.

    Citation Envoyé par mina86 Voir le message
    […] puis j'utilise
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    fgets(file, ligne_lue) //ligne_lue est un char *
    printf(ligne_lue);
    Où déclares-tu « ligne_lue » ? fgets() attend un char * parce qu'elle a besoin d'un tampon en mémoire pour déposer la chaîne qu'elle lit. Il faut donc déclarer un tableau de char, comme celui-ci : « char ligne_lue[64] ». Le symbole « ligne_lue » seul se comporte alors comme un pointeur qui pointe le début du tableau.

    En revanche, si tu as déclaré « ligne_lue » comme un simple pointeur sans l'initialiser, alors celui-ci ne pointe vers rien. Ton code est donc valide mais ta chaîne est déposée n'importe où en mémoire. Il se peut que cela déclenche une segfault, il se peut aussi que cela aille écraser des variables dans un segment de mémoire qui t'appartient.

    C'est pour cela qu'il ne faut pas directement faire l'amalgame « char * = string ».

  3. #3
    Membre confirmé
    Inscrit en
    Janvier 2007
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 59
    Par défaut
    j'ai juste voulu présenter l'alog, voici le code exact:

    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
     
    ...
         int nb_lignes = 1;
         char ligne_lue[512];
         int stop = 0;
         char prefix[11] = "      *PRE*";
         while(fgets(ligne_lue, 512, f) != NULL && !stop && nb_lignes<=3){
             printf("ligne_lue = %s\n", ligne_lue);
             switch (nb_lignes) {
                 case 1:
                     if(strncmp(ligne_lue, prefix, 11) != 0)
                         stop = 1;
                    break;
                 case 2:
                     if(strncmp(ligne_lue, prefix, 11) !=0)
                         stop = 1;
                     else 
                     {
                         /*  vérifier que la deuxième ligne
                          *  commence par la chaine "prefix"
                          *  puis extraire la signature */
                         char signature[512] = "";
                         int i = 11;
                         while(ligne_lue[i] != ' ')
                         {
                             sprintf(signature,"%s%c", signature, ligne_lue[i]);
                             i++;
                         }
                         old_hash = strdup(signature);
                     }
     
                    break;
                 ....
            }
            nb_lignes++;
         }
    ...
    les étapes sont dans la machine USS:
    1- on copie mon fichier dans /tmp:
    cp -S a='.ebc' source /tmp
    2- on convertit le fichier ebcedic en ascii:
    iconv -f IBM-1047 -t ISO8859-1 sysebc > sysasc
    3- dans le programme C on utilise le fichier ascii, mais le prblème c'est que les caractères lus sont (printf après le fgets):
    ligne_lue = ÄÄÄÄÄÄÅ(‹Å‹ÿˆ+¤+†Î…|Ä+|ŠÄ*…¤ŠÄЇ...

    comment je fais?

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    À noter au passage: Tu ne dois pas faire directement un printf() d'une ligne récupérée dans un fichier: Cela te rend vulnérable à une attaque par chaîne de format.
    Tu dois remplacer tous tes printf(ligne_lue) par des printf("%s", ligne_lue).

    PS: Pourrais-tu joindre l'un des fichiers convertis, histoire qu'on puisse vérifier qu'ils sont bien en ASCII étendu?
    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
    Membre confirmé
    Inscrit en
    Janvier 2007
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 59
    Par défaut
    Merci pour l'attention que vous portez à ma problématique.

    Pour le printf c t juste pour illustrer l'algo utilisé. Dans mon post d'hier j'ai mis mon code!

    Dan sle fichier "jeu de test.rar" ci joint vous trouverez:
    un fichier .cob (fichier d'origine (Win))
    un fichier .ebc (fichier EBCDIC)
    un fichier .asc (fichier .ebc renconvertir en ASCII)

    Merci.
    Fichiers attachés Fichiers attachés

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Après examen, il se trouve que le problème, c'est que ton fichier .ebc est déjà en ASCII, donc la conversion donne n'importe quoi.
    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.

Discussions similaires

  1. lire fichier ascii et détection de pics
    Par 3vince-fr dans le forum MATLAB
    Réponses: 2
    Dernier message: 08/07/2014, 14h55
  2. Lire un fichier Ascii ou texte, donnees en bloc pas en colonnes
    Par Fatehcz dans le forum Shell et commandes GNU
    Réponses: 9
    Dernier message: 27/03/2014, 13h14
  3. Réponses: 3
    Dernier message: 26/03/2014, 09h16
  4. Comment lire un fichier ASCII ?
    Par ThonySp dans le forum MATLAB
    Réponses: 2
    Dernier message: 25/06/2013, 08h01
  5. lire un fichier ascii complexe
    Par alexum dans le forum C++
    Réponses: 9
    Dernier message: 16/02/2005, 09h05

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