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 :

Stocker un fichier dans un tableau


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 28
    Par défaut Stocker un fichier dans un tableau
    bonjour,
    je suis debutante en langage c.et je dois ecrire un programme qui permet de stocker un fichier d'une taille variable dans un tableau dynamique.
    mon idée est de
    1. calculer la taille du fichier : le nombre de ses caractères par la fonction nbcaractere()
    2.creer un tableau dynamique qui a comme taille le nombre des caractère de fichier :la fonction convert() va retouner ce tableau de caractère .mais comment recuperer ce tableau dans le main et l'afficher:qlq'un pourra m'aider svp je dois rendre cette exercice deamin merci.voici mon 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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    int nbcaratere(void);
    int main()
    {
    int i,n;
    n=nbcaratere();
    char c;
    printf("la taille est de %d",n);
    for(i=0;i<n;i++)
    {
    c=convert();
    printf("%c",c);
    }
    return 0;
    }
     
    int nbcaratere(void)
    {
    FILE *f;
    f = fopen("c:\\t.txt", "r");
    if (f == NULL) /* ´equivalent `a << if (!f) >> */
    {
    printf("Erreur lors de l’ouverture du fichier!\n");
    }
    else
    {
    int fin;
    fseek(f, 0, SEEK_END);
    fin = ftell(f);
    //printf("Le fichier a une longueur de %i\n", fin);
    fseek(f, 0, SEEK_SET);
    fclose(f);
    return (fin);
    }
     
    }
     
     char convert(void)
    {
    FILE *f;
     
    int i,n, c;
    char *e;
    n=nbcaratere();
    e=(char*)malloc(n*sizeof(char));
     
    f = fopen("c:\\t.txt", "r");
    if (f == NULL) 
    {
    printf("Erreur lors de l’ouverture du fichier!\n");
    }
    else
    {
    do {
     
                c = fgetc (f);
               e[i]=c; 
     
    printf("le caractère est %c",e[i]);
     
     
            } while (c != EOF);
     
    }
    fclose(f);
    return *e;
    free (e);
     
     }

  2. #2
    Rédacteur

    Profil pro
    Étudiant
    Inscrit en
    Juin 2004
    Messages
    113
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2004
    Messages : 113
    Par défaut
    Ta fonction convert devra tout simplement retourner un char* au lieu de char, et dans ton main, tu fais quelque chose du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    char *T;
    T = (char*)malloc((taille_du_fichier)*sizeof(char));
    T = convert();
    Normalement, cela devrait marcher.

  3. #3
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Ben non, là, tu as une superbe fuite mémoire puisque l'adresse qui vient d'être fournie par le malloc est perdue !
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  4. #4
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Citation Envoyé par AjJi Voir le message
    Ta fonction convert devra tout simplement retourner un char* au lieu de char, et dans ton main, tu fais quelque chose du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    char *T;
    T = (char*)malloc((taille_du_fichier)*sizeof(char));
    T = convert();
    Normalement, cela devrait marcher.
    le cast du retour de malloc est inutile, qui plus est, sizeof (char) vaut toujours 1.
    2 possibilités :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char *T = malloc (taille_du_fichier);
    soit, si on veut se préparer au passage à l'unicode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char *T = malloc(taille_du_fichier * sizeof *T);

  5. #5
    Inactif  

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    534
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 534
    Par défaut
    Salut,

    Autant lire d'un trait le fichier.
    Par ex avec une 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
    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
     
     
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <unistd.h>
     
    char * read_the_file( const char * fname )
    {
       size_t r ;
       char* z = NULL  ;
       FILE * fd = NULL;
     
       struct stat st ;
     
       fd = fopen ( fname , "rb");
       if (fd == NULL)
       { perror ( fname );
         return NULL ;
       }
     
       if( stat( fname, &st ) != 0  )
       {
         perror("erreur dans stat\n") ;
         return NULL ;
       }
     
       z = (char*) malloc( (st.st_size + 1)  * sizeof(char) ) ;
       if( !z  ) return NULL  ;
     
       r = fread( z , sizeof( char ), st.st_size, fd ) ;
       if( r == (size_t) st.st_size )
       { 
          *( z + st.st_size ) = '\0' ;
     
       }
       else
       {
         printf("Impossible de lire %s\n", fname ) ;
         free( z ) ;
         z = NULL ;
       }
     
       if( fd ) fclose(fd) ;
     
       return  z ;
    }
     
    int main()
    { 
      char * z = read_the_file( "toto.txt" ) ;
      if ( z ) ....
    }

  6. #6
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par dj.motte Voir le message
    Autant lire d'un trait le fichier.
    Par ex avec une fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    #include <unistd.h>
    <...>
       struct stat st ;
    Pas standard... De plus, faire un stat() sur un fichier ouvert est une drôle d'idée... Je dirais comportement indéfini, mais je n'ai pas le temps de lire la doc de stat en détail...

    fseek()/ftell()/rewind() devrait suffire ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       z = (char *) malloc ((st.st_size + 1) * sizeof (char));
    A quoi sert le cast ?
    A quoi sert sizeof (char) alors qu'il vaut 1 par définition ?

    Pourquoi écrire du code plus compliqué que nécessaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       z = malloc (st.st_size + 1);
    Tout simplement...

    Par contre, attention à ne pas tomber dans la simplification extrême qui fait faire des âneries :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       if (!z)
          return NULL;
    le fichier n'est pas refermé...

    D'autre part, !z, bien que techniquement correct est peu lisible. Déjà, z est un curieux nom de pointeur. D'autre part, s'agissant d'un pointeur, z == NULL est plus approprié, même si c'est un peu plus long à écrire. Toujours privilégier la relecture du code. Ne pas présumer du niveau de geekness du lecteur potentiel...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
          *(z + st.st_size) = '\0';
    Techniquement correct, mais inutilement complexe.
    ou encore
    Je propose ceci :
    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
     
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
     
    char *read_the_file (const char *fname)
    {
       char *z = NULL;
       FILE *fp = fopen (fname, "rb");
       if (fp != NULL)
       {
          unsigned long len;
          fseek (fp, 0, SEEK_END);
          len = ftell (fp);
          rewind (fp);
     
          printf ("len = %lu\n", len);
          if (len <= ((size_t) - 1))
          {
             z = malloc (len + 1);
             if (z != NULL)
             {
                if (len == fread (z, 1, len, fp))
                {
                   z[len] = 0;
                }
                else
                {
                   printf ("Impossible de lire %s\n", fname);
                   free (z), z = NULL;
                }
             }
          }
          else
          {
             printf ("the file is too big\n");
          }
          fclose (fp);
       }
       else
       {
          perror (fname);
       }
       return z;
    }
     
    int main (void)
    {
       char *z = read_the_file ("main.c");
       if (z != NULL)
       {
          puts (z);
          free (z);
       }
       return 0;
    }

  7. #7
    Membre émérite Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Par défaut
    Salut,

    J'ai une toute petite question que signifie cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (len <= ((size_t) - 1))
    Si len est inférieur ou égale à la plus grande valeur que peut prendre une variable de type size_t moins un ...???

    Petite remarque il faut peut être un :
    #include <stdlib.h> /* malloc / free */


    @++

  8. #8
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    De plus, faire un stat() sur un fichier ouvert est une drôle d'idée... Je dirais comportement indéfini, mais je n'ai pas le temps de lire la doc de stat en détail...
    Non non, de ce côté là, pas de problème, heureusement d'ailleurs, comment vérifier sinon qu'un utilisateur n'a pas déjà ouvert un fichier avant nous? Au niveau de de la norme, aucun soucis!

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 53
    Par défaut
    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
    #include<stdio.h>
    #include<stdlib.h>
    void stockage_dans_tableau(char *tableau,FILE * flux,unsigned taille)
    {
         int k;
         int c;
         int i=0;
         do{
             c=fgetc(flux);
         if(k=!feof(flux))
         {
         tableau[i]=c;
         i++;
         }
         }while(k);
         printf("\n");
         fclose(flux);
    }
    int nb_caractere(FILE * flux)
    {
        int k;
        int c=0; 
        unsigned o=0;
     
     
     
    do
    {
            c=fgetc(flux);
    if(k=!feof(flux))
        {
        o++;
        }
    }while(k);
    fclose(flux);
    return o;
    }
    int main(void)
    {
        int nb=0;
        char *tableau;
        FILE *flux;
        char nom[1024];
        int i=0;
        printf("Entrez le nom du fichier : ");
        scanf("%s",nom);
            flux=fopen(nom,"r");
    nb=nb_caractere(flux);
    printf("il y a %d caracteres.\n",nb);
     
    tableau=calloc(nb+1,sizeof(char));
    if(tableau!=NULL)printf("bien alloue.\n");
    else printf("pas allloue.\n");
     flux=fopen(nom,"r");
    stockage_dans_tableau(tableau,flux,nb);
     
    for(i=0;i<nb;i++)
    {
    printf("%c",tableau[i]);
    }
     
    printf("\n\n");
     
    free(tableau);
    //system("pause");
    return 0;
    }
    certaine phrase du code peuvent etre facilement changee

Discussions similaires

  1. Réponses: 51
    Dernier message: 06/01/2008, 16h47
  2. Stocker nom de fichier dans un tableau
    Par J0r_x dans le forum Collection et Stream
    Réponses: 14
    Dernier message: 29/03/2007, 18h26
  3. charger un fichier dans un tableau
    Par nico0007 dans le forum Delphi
    Réponses: 3
    Dernier message: 16/01/2007, 23h59
  4. Mettre un fichier dans un tableau
    Par peuf23 dans le forum Langage
    Réponses: 3
    Dernier message: 26/07/2005, 10h47
  5. Réponses: 4
    Dernier message: 10/10/2003, 18h04

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