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 :

Problème stockage de fichier dans tableau


Sujet :

C

  1. #1
    Membre averti
    Inscrit en
    Janvier 2009
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 17
    Par défaut Problème stockage de fichier dans tableau
    Bonjour à tous,
    J'ai quelque soucis pour finaliser mon projet, je cherche à récupérer des données précises dans un fichier .txt (générer par un programme de simulation électromagnétique). Pour se faire je souhaite récupérer le fichier dans un tableau de char, et ensuite je lance des fonctions créer par mes soins pour recherché certain mots clef et écrire les données qui m'interesse dans un autre fichier...

    Je parviens à faire toutes ces étapes sauf la premier qui consiste à récupérer l'intégralité du fichier de base dans un tableau (fichier de 500 ko). Il se passe quelque chose de bizarre car je lis bien tout le fichier mais dans mon tableau j'ai la partie final du fichier qui se répète le nombre de fois élevé pour occuper la place allouer...

    Bref, le problème est au tout début du programme de la fonction main() car je récupère pas tout dans *txt. Merci de m'aider à parvenir à mes fins.
    Je vous mets la partie qui pose problème à mon avis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    long unsigned int i=0, endTxt=SizeOfFileTexte();
    char *a,*txt;
    txt = new char[endTxt];
    FILE *p;
    p=fopen("youness.txt","r");
    while(i<endTxt)
    {
    fread(a,sizeof(char),1,p);
    txt[i]=*a;
    i+=1;
    }
    fclose(p);
    Si dans la boucle while je demande d'afficher chaque caractère lu ça m'affiche bien le fichier en entier, mais la fenètre DOS se rafraichit et à la fin il ne reste que la partie final du fichier qui se retrouve dans la fenètre DOS et je crois que c'est cette même partie que se retrouve dans mon txt répété n fois. Je ne comprends rien merci de m'aider à récupérer tous dans mon *txt

    Cordialement,

    Voilà le programme :
    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
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
     
    #include "def.h"
     
    void main(void)
    {
    //A METTRE INTERFACE USER+CREATION DE TXT
    //Création du tableau (txt) de taille endTxt contenant grating.res
    long unsigned int i=0, endTxt=SizeOfFileTexte();
    char *a,*txt;
    txt = new char[endTxt];
    FILE *p;
    p=fopen("youness.txt","r");
    while(i<endTxt)
    {
    fread(a,sizeof(char),1,p);
    txt[i]=*a;
    i+=1;
    }
    fclose(p);
    // le constructeur de ifstream permet d'ouvrir un fichier en lecture
     
    // le constructeur de ifstream permet d'ouvrir un fichier en lecture
        /*std::ifstream fichier( "fichier.txt" );
     
        if ( fichier ) // ce test échoue si le fichier n'est pas ouvert
        {
            std::stringstream buffer; // variable contenant l'intégralité du fichier
            // copier l'intégralité du fichier dans le buffer
            buffer << fichier.rdbuf();
            // nous n'avons plus besoin du fichier !
            fichier.close();
            // manipulations du buffer...
            std::cout << "Taille du buffer : " << buffer.str().size() << '\n';
        }*/
     
    i=0;
    //Ouverture du fichier de sortie
    p=fopen("res.txt","w");
    //Quelque que charactère en ASCII
    char tabulation=9,enter=13,space=32,b=98;
     
    //Ecriture du fichier de sortie
    //Recherche de longueur d'onde
    int k=0;
    while(i<endTxt)
    {
    i=SearchWord(i,txt,endTxt,"wavelength=   ",14);
    i=NextWord(i,txt,endTxt);
    k=0;
    while (k<7 )
    {
    *a = txt[i+k];
    fwrite(a,sizeof(char),1,p);
    k++;
    }
    //Tabulation pour Exel colone
    *a = tabulation;
    fwrite(a,sizeof(char),1,p);
     
    //Recherche des données de reflection 0 0
    i=SearchWord(i,txt,endTxt,"reflection  0         0",23);
    i=i+23;
    //Donnée 1 de reflection
    i=NextWord(i,txt,endTxt);
    b=txt[i];
    while (b!=space )
    {
    cout << txt[i];
    *a = txt[i];
    fwrite(a,sizeof(char),1,p);
    i++;
    b=txt[i];
    }
    //Tabulation pour Exel colone
    cout << tabulation;
    *a = tabulation;
    fwrite(a,sizeof(char),1,p);
    //Donnée 2 de reflection
    i=NextWord(i,txt,endTxt);
    b=txt[i];
    while (b!=space )
    {
    cout << txt[i];
    *a = txt[i];
    fwrite(a,sizeof(char),1,p);
    i++;
    b=txt[i];
    }
    //Tabulation pour Exel colone
    cout << tabulation;
    *a = tabulation;
    fwrite(a,sizeof(char),1,p);
    //Donnée 3 de reflection
    i=NextWord(i,txt,endTxt);
    b=txt[i];
    while (b!=space )
    {
    cout << txt[i];
    *a = txt[i];
    fwrite(a,sizeof(char),1,p);
    i++;
    b=txt[i];
    }
    //Tabulation pour Exel colone
    cout << tabulation;
    *a = tabulation;
    fwrite(a,sizeof(char),1,p);
    //Donnée 4 de reflection
    i=NextWord(i,txt,endTxt);
    b=txt[i];
    while (b!=space )
    {
    cout << txt[i];
    *a = txt[i];
    fwrite(a,sizeof(char),1,p);
    i++;
    b=txt[i];
    }
    //Tabulation pour Exel colone
    cout << tabulation;
    *a = tabulation;
    fwrite(a,sizeof(char),1,p);
    //Donnée 5 de reflection   PROBLEME ICI
    i=NextWord(i,txt,endTxt);
    /*k=0;
    while(k<12)
    {
    *a = txt[i+k];
    fwrite(a,sizeof(char),1,p);
    k++;i++;
    }*/
    b=txt[i];
    while (b!=space )
    {
    cout << txt[i];
    *a = txt[i];
    fwrite(a,sizeof(char),1,p);
    i++;
    b=txt[i];
    }
    //recherche de la ligne transmission
    i=SearchWord(i,txt,endTxt,"transmission",12);
    i=i+12;
    //Tabulation pour Exel colone
    cout << tabulation;
    *a = tabulation;
    fwrite(a,sizeof(char),1,p);
    //Donnée 6 de translation
    i=NextWord(i,txt,endTxt);
    b=txt[i];
    while (b!=space )
    {
    cout << txt[i];
    *a = txt[i];
    fwrite(a,sizeof(char),1,p);
    i++;
    b=txt[i];
    }
    //Tabulation pour Exel colone
    cout << tabulation;
    *a = tabulation;
    fwrite(a,sizeof(char),1,p);
    //Donnée 7 de translation
    i=NextWord(i,txt,endTxt);
    b=txt[i];
    while (b!=space )
    {
    cout << txt[i];
    *a = txt[i];
    fwrite(a,sizeof(char),1,p);
    i++;
    b=txt[i];
    }
    //Tabulation pour Exel colone
    cout << tabulation;
    *a = tabulation;
    fwrite(a,sizeof(char),1,p);
    //Donnée 8 de translation
    i=NextWord(i,txt,endTxt);
    b=txt[i];
    while (b!=space )
    {
    cout << txt[i];
    *a = txt[i];
    fwrite(a,sizeof(char),1,p);
    i++;
    b=txt[i];
    }
    //Tabulation pour Exel colone
    cout << tabulation;
    *a = tabulation;
    fwrite(a,sizeof(char),1,p);
    //Donnée 9 de translation
    i=NextWord(i,txt,endTxt);
    b=txt[i];
    while (b!=space )
    {
    cout << txt[i];
    *a = txt[i];
    fwrite(a,sizeof(char),1,p);
    i++;
    b=txt[i];
    }
    //Tabulation pour Exel colone
    cout << tabulation;
    *a = tabulation;
    fwrite(a,sizeof(char),1,p);
    //Donnée 10 de translation    Surement Probleme aussi
    i=NextWord(i,txt,endTxt);
    b=txt[i];
    while (b!=space )
    {
    cout << txt[i];
    *a = txt[i];
    fwrite(a,sizeof(char),1,p);
    i++;
    b=txt[i];
    }
    //Passage a la ligne pour prochaine longueur d'onde
    cout << enter;
    *a = enter;
    fwrite(a,sizeof(char),1,p);
    }//Fin de l'ecriture du fichier
     
    //Fin et destruction
    char aaa;
    cin >> aaa;
    fclose(p);
    delete txt;
    exit(1);
    /*
    p=fopen("res.txt","w");
    fwrite(a,sizeof(char),1,p);
    fclose(p);
    */
    }
    La déclaration des fonction "def.h":
    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
    #ifndef def_h
    #define def_h
    #include <stdio.h>
    #include <iostream>
    #include <stdlib.h>
     
    long unsigned int SizeOfFileTexte(void);    //return la taille du fichier texte.txt
    long unsigned int SearchAscii(int,long unsigned int,char*,long unsigned int);         //recherche le code ASCII égale à int1 à partir de int2 dans le tableau de caractère char* de taille int3 et retourne la position int0
    long unsigned int SearchEnter(long unsigned int,char*,long unsigned int);             //idem sauf que le code ASCII int1 n'existe pas c'est forcément 13 (13=enter)
    long unsigned int NextWord(long unsigned int ,char*,long unsigned int );//retourne le pos du premier caractère du prochain mot
    long unsigned int NextLine(long unsigned int ,char*,long unsigned int );//retourne le pos du premier carac de la ligne suivante
     
     
    int Compare(long unsigned int,char*,long unsigned int,char*,int);//compare char2 de taille long unsigned int3 a partir de longUncsignedInt1 avec char4 de taille int5
    long unsigned int SearchWord(long unsigned int,char*,long unsigned int,char*,int);//retourne la position int3 de la premiere lettre du mot char2 de taille int2 dans le tableau char1 de taille int1
    void youness(char*,long unsigned int,char*,int,int,FILE *);
    #endif
    La définition des fonction "def.cpp" :
    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
    #include "def.h"
     
    long unsigned int SizeOfFileTexte(void)
    {
    FILE *p;
    p=fopen("youness.txt","r");
    char *a;
    long unsigned int e=0;
     
    while(fread(a,sizeof(char),1,p))
    	{
    	e+=1;
    	}
     
    fclose(p);
    return(e);
    }
     
    long unsigned int SearchAscii(int val,long unsigned int deb,char*a,long unsigned int size)
    {
    long unsigned int i=0;//stock la position courante
    	while(i+deb<size && a[i+deb]!=val)
    	{
       i++;
    	}
    return(i+deb);
    }
     
     
    long unsigned int SearchEnter(long unsigned int deb,char*a,long unsigned int size)
    {
    long unsigned int i=0;//stock la position courante
    	while(i+deb<size && a[i+deb]!='\n')
    	{
       i++;
    	}
    return(i+deb);
    }
     
     
    long unsigned int NextWord(long unsigned int deb,char*a,long unsigned int size) // va à la premiere lettre du prochain mot
    {
    long unsigned int i=0;//stock la position courante
    	while(i+deb<size && a[i+deb]!=' ')
    	{
       i++;
    	}//on a quitter le mot on est sur le premier espace
     
    while(i+deb<size && a[i+deb]==' ')
    	{
       i++;
    	}//on est sur la premiere data
     
    return(i+deb);
    }
     
    long unsigned int NextLine(long unsigned int deb,char*a,long unsigned int size) // va à la premiere lettre du prochain mot
    {
    long unsigned int i = SearchEnter(deb,a,size);
    i++;
    return(i);
    }
     
     
     
    int Compare(long unsigned int i,char *texte,long unsigned int SizeTxt,char *sequence,int SizeSeq)
    {
    int j=0,k=0;
    for(j=0;j<SizeSeq;j++)
    	{
       if( *(texte+i+j)==*(sequence+j) ){k++;}
       }
    if(k==SizeSeq){return(1);}
    if(k!=SizeSeq || (SizeSeq+i)<SizeTxt){return(0);}
    }
     
    long unsigned int SearchWord(long unsigned int i,char *texte,long unsigned int SizeTxt,char *sequence,int SizeSeq)
    {
    int k=0;
    while(k!=1)
    {
    k=Compare(i,texte,SizeTxt,sequence,SizeSeq);
    i++;
    }
    i--;
    return(i);
    }
     
    void youness(char *txt,long unsigned int endTxt,char *ordre,int sizeOrdre,int N,FILE *res)
    {
    /*res=fopen("res.txt","w");
    long unsigned int i=0,j=0;
    int k=0,l=0,c=0;
    int precision=7; //nombre de caractère de phase affichée A METTRE EN PARAMETRE USER
    	for(l=0;l<N;l++)
    	{
    		for (k=0;k<4;k++)
    		{
    		i=SearchGoodOrderLine(i,txt,endTxt,ordre,sizeOrdre);
    		i=NextWord(i,txt,endTxt);
    		i=NextWord(i,txt,endTxt);
    		i=NextWord(i,txt,endTxt);
    //cout << i<<"\n";
       	j=i;
     
       	while((txt[j]!='\n') && (c<precision) )
       		{
    			cout << txt[j];
             fwrite(txt+j,sizeof(char),1,res);
          	j++;c++;
       		}
       	c=0;
       	cout << " ";
          fwrite(" ",sizeof(char),1,res);
    		}
    	cout << "\n";
       fwrite("\n",sizeof(char),1,res);
       }
    fclose(res);
    */}
    En pièce jointe je vous ai mis le début du fichier à lire "youness.txt" mais tronqué car je peux pas poster plus que 64 ko...
    Fichiers attachés Fichiers attachés

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Salut,

    Tes codes sont en C++.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 62
    Par défaut
    affiche endTxt.

    Vu que tu fais txt = new char[endTxt]; je suppose que endtxt doit etre égal au nombre de mot de ton fichier non?

    sauf que je doute qu'il ai la bonne valeur.

    déclare le dynamiquement ça t'évitera bien des soucis.

  4. #4
    Membre averti
    Inscrit en
    Janvier 2009
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 17
    Par défaut
    Salut,

    Tes codes sont en C++.
    Bon a part un petit new qui traine c'est globalement du C.
    Vu que tu fais txt = new char[endTxt]; je suppose que endtxt doit etre égal au nombre de mot de ton fichier non?
    En faite, endTxt doit contenir le nombre de char dans le fichier, et cela fonctionne, enfin il me semble, endTxt est de l'ordre de 470 000...

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Bon a part un petit new qui traine c'est globalement du C.
    ... qui ne compilera pas avec un compilateur C.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 62
    Par défaut
    ah dsl je croyais que tu remplissais bien ton tableau sauf a la fin où il y avait n'importe quoi dedans, j'ai lus un peu vite.

    peux tu donner un exemple assez simple de ce que donne ton fichier texte et ton tableau final ? j'ai pas tres bien compris ton erreur exact.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Sur ma machine, avec Borland C++ Builder 6, en remplacant dans tafonction main char *a par char a, je lis correctement le fichier que tu donnes (mais ce serait probablement une bonne chose de faire la meme correction dans SizeOfFileTexte()

    Ca donne donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    long unsigned int i=0, endTxt=SizeOfFileTexte();
    char a,*txt;
    txt = new char[endTxt];
    FILE *p;
    p=fopen("youness.txt","r");
    while(i<endTxt)
    {
    fread(&a,sizeof(char),1,p);
    txt[i]=a;
    i+=1;
    }
    fclose(p);
    Si après cela j'écris le contenu de txt dans un fichier, je retrouve le fichier de départ...

    Note que le problème se répète plus loin quand tu écris ton fichier.... Tu fais des choses comme

    *a=txt[i];

    Francois
    Dernière modification par Invité ; 26/05/2009 à 22h02.

  8. #8
    Membre averti
    Inscrit en
    Janvier 2009
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 17
    Par défaut
    bonjour,

    Je n'ai pas le fichier comportant ce qu'il y a dans le tableau. Cependant si on fait une boucle jusqu'a la fin du fichier dans laquelle on appelle fread() et qu'on demande d'afficher dans la fenètre DOS le caractère courant, on voit l'ensemble du fichier défiler à toute allure dans la fenêtre DOS. Une fois cette boucle terminée on pourrait penser que la fenêtre DOS contient tout le fichier cependant se n'est pas le cas, (la fenêtre dos doit avoir une taille minimal) et on a qu'une partie (final) du fichier dans la fenêtre DOS. Et c'est cette partie qui se retrouve dans mon tableau répété un grand nombres de fois (car le tableau contient autand de caractère que le fichier initial.

    Bref, je compile mon projet en "application .exe" sous console DOS. Avez vous un moyen svp ?

Discussions similaires

  1. Charger un fichier dans tableau d'entier
    Par nico0007 dans le forum Langage
    Réponses: 12
    Dernier message: 17/04/2008, 11h30
  2. Stockage de fichiers dans une base MySQL
    Par FredMines dans le forum SQL Procédural
    Réponses: 6
    Dernier message: 09/01/2006, 22h15
  3. [TPAbbrevia] Problème ajout de fichiers dans archive
    Par Pill_S dans le forum Composants VCL
    Réponses: 4
    Dernier message: 13/10/2005, 23h18
  4. [SGBD] Manière de stockage de fichiers dans MySql
    Par Promise dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 08/09/2005, 18h02

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