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 :

test sur des caracteres particuliers : ^@


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Décembre 2008
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 22
    Par défaut test sur des caracteres particuliers: ^@
    Bonjour à tous,
    Je travail sous linux et j'ai besoin de lire des gros fichiers de "double", les fichiers en question ont en fin de ligne des caractères particulier: ^M , qui sont (me semble-t-il) les traduction ASCII en linux du saut de ligne de windows.
    De plus, certaines lignes sont "abimées" et sont remplies de ^@. Je ne sais pas à quoi correspondent ces caractères spéciaux mais je voudrais faire un test pour => goto LigneSuivante, si le programme rencontre ce caractère (j'ai vu que le goto était déconseillé mais je vois pas comment faire autrement).
    Ma question est la suivante: ^@, est-il un caractère qui peut être lu, car le fscanf que je fais pour lire mon fichier ligne par ligne, ne semble pas le détecter. Si oui, j'aimerais bien un indice sur la manière d'opérer^^
    Merci d'avance

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 495
    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 495
    Par défaut
    Hello,

    « ^@ », c'est la représentation du caractère ASCII numéro zéro (le « @ » se situe juste avant le « A » dans la table ASCII). Essaie hexdump ou xxd pour visualiser le contenu de tes fichiers en hexadécimal et ASCII à la fois. Tu peux utiliser entre autres fgetc() pour lire les caractères un par un.

    Pour le goto, on peut toujours faire autrement. Poste ton code ici, on fera des remarques.

  3. #3
    Membre averti
    Inscrit en
    Décembre 2008
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 22
    Par défaut
    rebonjour
    j'ai reussi a codé un ptit truc qui trouve un caractère @ "normal",
    le problème est qu'il ne trouve pas ceux que je veux.
    cad: mon editeur est vi, les caractère "normaux" sont en blanc, et les caractères que je voudrais détecter sont en bleu ^M pour les fins de lignes, et ^@ pour les 0 (j'ai vérifié dans les tables ASCII, c'est bien la traduction du 0) merciObsidian

    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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include <math.h>
    #include <malloc.h>
    #include <time.h>
     
    #define Rp 3393.5
    #define TAILLE 200000
    #define TAILLE_MAX 100
    #define M_PI   3.14159265358979323846
    #define PI_180 M_PI/180.
     
    int main()
    {
            clock_t start, end;
            start = clock();
     
        FILE* jour = NULL;
        FILE* jpd = NULL;
        FILE* nuit = NULL;
        FILE* npd = NULL;
     
            FILE* fichierpc = NULL;
        FILE* fichiersu = NULL;
     
        long i=0;
        long j=0;
        long ki=0;
        long m=0;
     
        const char njour[5] = "jour";
        const char nnuit[5] = "nuit";
        const char njourdyn[8] = "jpaydyn";
        const char nnuitdyn[8] = "npaydyn";
        const char cheminpc[24] = "/data/FIC_STS/PCENTRIC/";
        const char cheminsu[24] = "/data/FIC_STS/SUNSTATE/";
        const char ext[5]=".STS";
        const char dat[5]=".DAT";
     
        char nom[4];
        char ye[3];
        char dd[4];
        char line1[TAILLE_MAX]="";
        char line2[TAILLE_MAX]="";
        char line3[300]="";
    //    char arob[3]="^@";
     
        int kj,kn;
        int nb_lignepc = 0;
        int nb_lignesu = 0;
        int oui;
        int year,doy,hour,mint,sec,msec;
        int year1,doy1,hour1,mint1,sec1,msec1;
        int carac = 0;
     
        double dday[TAILLE],bx,by,bz,Grange,x,y,z;
        double ormsbx,ormsby,ormsbz,ormsGrange,oBSCbx,oBSCby,oBSCbz;
        double oBSCGrange,oBDpbx,oBDpby,oBDpbz,oBDpGrange,SAmY,SApY,SAO;
     
        double dday1,bx1,by1,bz1,Grange1,x1,y1,z1;
        double ormsbx1,ormsby1,ormsbz1,ormsGrange1,oBSCbx1,oBSCby1,oBSCbz1;
        double oBSCGrange1,oBDpbx1,oBDpby1,oBDpbz1,oBDpGrange1,SAmY1,SApY1,SAO1;
     
        double tm1,r2d,phis,pi,tlocal1,r,phi,teta,cp,sp,ct,st,br,bt,bp,altm;
         double oBDpbr,oBDpbt,oBDpbp;
        double ddayi,ddayt;
        double test;
     
        kj=0;
        kn=0;
        ddayt=0.;
        ddayi=0.;
        j=1;
     
            int caracpc,caracsu;
            int arobTrouvpc = 0;
            int arobTrouvsu = 0;
            int ligneArobpc = 0;
            int ligneArobsu = 0;
     
                        sprintf(ye,"99");
     
        char fichiernuit[100]="";
        char fichierjour[100]="";
        char fichierjpd[100]="";
        char fichiernpd[100]="";
     
        strcat(fichierjour,njour);
         strcat(fichierjour,ye);
          strcat(fichierjour,dat);
        jour = fopen(fichierjour,"w+");
     
        strcat(fichiernuit,nnuit);
         strcat(fichiernuit,ye);
          strcat(fichiernuit,dat);
        nuit = fopen(fichiernuit,"w+");
     
        strcat(fichierjpd,njourdyn);
         strcat(fichierjpd,ye);
          strcat(fichierjpd,dat);
        jpd = fopen(fichierjpd,"w+");
     
        strcat(fichiernpd,nnuitdyn);
         strcat(fichiernpd,ye);
          strcat(fichiernpd,dat);
        npd = fopen(fichiernpd,"w+");
     
        test=0;
               for (ki=194; ki<=194 ; ki++)
               {oui=0;
                   if (ki<10)
                   {sprintf(dd,"00%ld",ki);
                        }
                     else if (ki>=10 && ki<100)
                     {sprintf(dd,"0%ld",ki);
                          }
                        else
                        {sprintf(dd,"%ld",ki);
                             }
     
        char dossierpc[100]="";
        char dossiersu[100]="";
              strcat(dossierpc,cheminpc);
                 strcat(dossierpc,ye);
                     strcat(dossierpc,dd);
                         strcat(dossierpc,ext);
     
              strcat(dossiersu,cheminsu);
                 strcat(dossiersu,ye);
                     strcat(dossiersu,dd);
                         strcat(dossiersu,ext);
     
     
            fichierpc = fopen(dossierpc,"r");
            fichiersu = fopen(dossiersu,"r");
     
        if (fichierpc != NULL && fichiersu != NULL)
        {
            fprintf(stdout,"%s loading data...\n",dossierpc);
            fprintf(stdout,"%s loading data...\n",dossiersu);
            fflush(stdout);
     
             nb_lignepc=0;
        while((fgets(line3,300,fichierpc)) != NULL)
            {++nb_lignepc;
             arobTrouvpc = strchr(line3,'@');
     
             if (arobTrouvpc != NULL)
                {ligneArobpc = nb_lignepc;
                printf("Trouve!! @ at line %d, in %s\n",ligneArobpc,dossierpc);
                    }
            }
     
             nb_lignesu = 0;
        while((fgets(line3,300,fichiersu)) != NULL)
            {++nb_lignesu;
    //         caracsu = fgetc(fichiersu);
             arobTrouvsu = strchr(line3,'@');
     
             if (arobTrouvsu != NULL)
                {ligneArobsu = nb_lignesu;
                printf("Trouve!! @ at line %d, in %s\n",ligneArobsu,dossiersu);
                    }
            }
        if (nb_lignepc != nb_lignesu)
        {printf("WARNING !! number of data different between pcentric/sunstate %s%s%s\n",ye,dd,ext);
                }
        fclose(fichiersu);
        fclose(fichierpc);
        }
    }
    }
    avec ce code, je lis 2 fichiers (faites pas attention a la synthaxe des noms de fichiers, je suis censé en lire 500 avec des noms incrémentés en fonction de l'année, mais celui qui m'embete est le 99194 ) et recherche des @, mlais seulement les @ normaux sont trouvés...
    saurais-tu comment faire mieux que ce que j'ai fait?
    merci

  4. #4
    Membre averti
    Inscrit en
    Décembre 2008
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 22
    Par défaut
    après de plus amples recherches, il semble que mon fichier affiche ces caractères à la suite du transfert depuis son ancienne station windows, = son format est application/octet-stream
    une solution pourrait alors être de le convertir en utf-8, seulement la seule manip que je connaisse, c'est iconv -f ancien_encodage -t nouveau_encodage nom_de_fichier
    et malheureusement iconc ne connait pas octet-stream (iconv --list)
    le dos2unix ne marche pas...
    est-ce que quelqu'un connait une autre solution pour convertir de l'octet-stream vers du utf-8?
    merci pour vos réponses précédentes^^

  5. #5
    Membre émérite
    Inscrit en
    Avril 2007
    Messages
    667
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Avril 2007
    Messages : 667
    Par défaut
    Salut,
    octet-stream n'est pas un encodage, c'est un type mime generique utilise lorsqu'aucun autre ne semble correspondre.
    Comment transferes-tu tes fichiers depuis windows ?

  6. #6
    Membre averti
    Inscrit en
    Décembre 2008
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 22
    Par défaut test d'erreur de format possible?
    Citation Envoyé par tonton fred Voir le message
    Salut,
    octet-stream n'est pas un encodage, c'est un type mime generique utilise lorsqu'aucun autre ne semble correspondre.
    Comment transferes-tu tes fichiers depuis windows ?
    en fait ce sont des DVD de données qui ont "dû être créés" sous windows (j'en suis même pas sûr...)
    mais concernant mon problème, en fait je me suis rendu compte que les lignes dans lesquelles aparaissent les "^@" sont déformées. cad: elles ne contiennent pas le meme nombre de valeurs que les autres. Au début je pensais faire un test de caractère ligne par ligne pour détecter les ^@, mais : trop long (5000 fichiers de 50000 lignes) et impossible à lire, puisque ce ne sont pas des caractères ASCII.
    Finalement, on m'a conseillé une autre solution qui pourrait être de faire un test de format de chaque ligne, mais là je bloque, je n'ai aucune idée de la manière dont il faudrait procédé, car je voudrais éviter de lire les caractères un à un...
    vous pensez à une solution?
    Merci

Discussions similaires

  1. Gestion des caractères particuliers pendant un import
    Par clemasson dans le forum Access
    Réponses: 2
    Dernier message: 09/12/2006, 17h58
  2. [Index Server] Recherche sur des caractères chinois
    Par d1g-2-d1g dans le forum Autres langages
    Réponses: 5
    Dernier message: 13/11/2006, 10h54
  3. Test sur des records
    Par Tchaill39 dans le forum Delphi
    Réponses: 3
    Dernier message: 18/09/2006, 15h51
  4. [JUnit] Les tests sur des interfaces graphiques
    Par adilo dans le forum Tests et Performance
    Réponses: 5
    Dernier message: 01/02/2006, 14h27
  5. [langage] Test sur un caractère
    Par GLDavid dans le forum Langage
    Réponses: 8
    Dernier message: 07/07/2004, 18h03

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