Ecrire un fichier dans un char *

Ecrire un fichier dans un char * - C - Programmation

Marsh Posté le 29-04-2005 à 15:53:42    

Bonjour
j'aimerais ecrire le contenu d'un fichier dans un char *.
Je pensais utiliser le code suivant mais il ne marche pas:
 
char * str = NULL;
char buffer[BUFFER_SIZE];
 
while ( (c = read(f_desc_fd,buffer,BUFFER_SIZE)) > 0)
    {    
     strcat(str ,buffer);
    }
 
Qun pourrai m'aider a faire en sorte que mon prog fonctionne ?
Merci.

Reply

Marsh Posté le 29-04-2005 à 15:53:42   

Reply

Marsh Posté le 29-04-2005 à 15:54:48    

tu as cherché sur google avant?

Reply

Marsh Posté le 29-04-2005 à 15:59:39    

man 3 read, et pas de buffer_size, positionne toi a la fin du fichier pour en connaitre la taille en caractere

Reply

Marsh Posté le 29-04-2005 à 16:00:13    

Dans un char * on ne peut mettre que 4 octets (8 en 64 bits). Donc, a part si ton fichier est tres petit, ca va etre difficile.

Reply

Marsh Posté le 29-04-2005 à 16:09:38    

le  strcat(str ,buffer); est pas mal aussi

Reply

Marsh Posté le 29-04-2005 à 16:10:43    

matafan a écrit :

Dans un char * on ne peut mettre que 4 octets (8 en 64 bits). Donc, a part si ton fichier est tres petit, ca va etre difficile.


 
bah c'est a dire que je n'ai pas fais de malloc vu ke je connais pas la taille du fichier a lire. Le problème ne vient pas de là. Il vient du fait que je n'arrive pas a copier le buffer dans ma chaine de destination

Reply

Marsh Posté le 29-04-2005 à 16:12:01    

skelter a écrit :

le  strcat(str ,buffer); est pas mal aussi


c'est a dire ??

Reply

Marsh Posté le 29-04-2005 à 16:15:42    

El touristo a écrit :

c'est a dire ??


 
Il veut dire que tu devrais chercher de la documentation sur les pointeurs.

Reply

Marsh Posté le 29-04-2005 à 16:18:37    

et utilise fopen, fread, ...
man stdio

Reply

Marsh Posté le 29-04-2005 à 17:58:05    

El touristo a écrit :

j'aimerais ecrire le contenu d'un fichier dans un char *.


C'est quoi un 'char *' ?
 
http://mapage.noos.fr/emdel/notes.htm#char_star
http://mapage.noos.fr/emdel/notes.htm#pointeurs

Citation :


char * str = NULL;
char buffer[BUFFER_SIZE];
 
while ( (c = read(f_desc_fd,buffer,BUFFER_SIZE)) > 0)
    {    
     strcat(str ,buffer);
    }




str est un pointeur NULL
 
strcat(str, ...);
 
invoque donc un comportement indéfini. D'autre part read() n'est pas une fonction standard.
 
http://mapage.noos.fr/emdel/notes.htm#fichiers


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 29-04-2005 à 17:58:05   

Reply

Marsh Posté le 30-04-2005 à 11:53:10    

El touristo a écrit :

bah c'est a dire que je n'ai pas fais de malloc vu ke je connais pas la taille du fichier a lire. Le problème ne vient pas de là. Il vient du fait que je n'arrive pas a copier le buffer dans ma chaine de destination


Et tu crois que le C va t'allouer tout seul assez de mémoire pour stocker ton fichier ? :??: :sarcastic:
 
Parfois il y a des gugusses qui ont une approche un peu "magique" de l'informatique. Pour eux, tout se fait tout seul !!!  :lol:


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 01-05-2005 à 15:54:01    

c'est mon jour de bonté, et c'est sous license BSD (et sa rime ^^)

Code :
  1. /*  
  2.    charge un fichier en mémoire et retourne le pointeur sur les données (NULL en cas d'erreur),
  3.    attention le pointeur est a desallouer soi-même !
  4.    accessoiremnt si on passe un pointeur sur un unsigned long, on récupère la taille du buffer alloué
  5. */
  6. unsigned char *LoadFileInMemory(char *szFilePath, unsigned long *pulFileSize){
  7. FILE *fpData;
  8. unsigned char *pData;
  9. unsigned long ulFileSize;
  10. unsigned long ulReadBytes;
  11. if(!szFilePath)
  12.  return NULL;
  13. fpData = fopen(szFilePath, "rb" );
  14. if(!fpData)
  15.  return NULL;
  16. fseek(fpData, 0, SEEK_SET);
  17. fseek(fpData, 0, SEEK_END);
  18. ulFileSize = ftell(fpData);
  19. fseek(fpData, 0, SEEK_SET);
  20. pData = (unsigned char *)malloc(ulFileSize * sizeof(unsigned char));
  21. if(!pData){
  22.  fclose(fpData);
  23.  return NULL;
  24. }
  25. ulReadBytes = fread(pData, sizeof(unsigned char), ulFileSize, fpData);
  26. fclose(fpData);
  27. if(ulReadBytes != ulFileSize){
  28.  free(pData);
  29.  return NULL;
  30. }
  31. if(pulFileSize)
  32.  *pulFileSize = ulFileSize;
  33. return pData;
  34. }


Message édité par sigmatador le 01-05-2005 à 16:15:09
Reply

Marsh Posté le 01-05-2005 à 16:02:43    

sigmatador a écrit :

c'est mon jour de bonté, et c'est sous license BSD (et sa rime ^^)



main.c: In function `LoadFileInMemory':
main.c:20: `FILE' undeclared (first use in this function)
 
main.c:20: (Each undeclared identifier is reported only once
 
main.c:20: for each function it appears in.)
main.c:20: `fpData' undeclared (first use in this function)
main.c:26: `NULL' undeclared (first use in this function)
main.c:28: warning: implicit declaration of function `fopen'
main.c:33: warning: implicit declaration of function `fseek'
main.c:33: `SEEK_SET' undeclared (first use in this function)
main.c:34: `SEEK_END' undeclared (first use in this function)
 
main.c:35: warning: implicit declaration of function `ftell'
main.c:38: warning: implicit declaration of function `malloc'
main.c:43: warning: implicit declaration of function `fread'
main.c:48: warning: implicit declaration of function `fclose'



#include <stdio.h>
#include <stdlib.h>
 
unsigned char *LoadFileInMemory (char const *szFilePath, size_t * pFileSize)
{
   unsigned char *pData = NULL;
 
   if (szFilePath != NULL)
   {
      FILE *fpData = fopen (szFilePath, "rb" );
 
      if (fpData != NULL)
      {
         fseek (fpData, 0, SEEK_END);
 
         {
            unsigned long ulFileSize = ftell (fpData);
 
            /* clipping */
            if (ulFileSize > ((size_t) - 1))
            {
               ulFileSize = (size_t) - 1;
            }
 
            pData = malloc (ulFileSize);
 
            if (pData != NULL)
            {
               rewind (fpData);
 
               {
                  unsigned long ulReadBytes = fread (pData, 1, ulFileSize, fpData);
 
                  if (ulReadBytes == (size_t) ulFileSize)
                  {
                     if (pFileSize != NULL)
                     {
                        *pFileSize = ulFileSize;
                     }
                  }
                  else
                  {
                     free (pData), pData = NULL;
                  }
               }
            }
         }
         fclose (fpData), fpData = NULL;
      }
   }
   return pData;
}
 
static void dump (unsigned char *p, size_t size)
{
   size_t i = 0;
   size_t N = 16;
 
   while (i < size)
   {
      printf ("%02X ", p[i]);
 
      i++;
      if (i % N == 0)
      {
         printf ("\n" );
      }
   }
   if (i % N != 0)
   {
      printf ("\n" );
   }
}
 
int main (void)
{
   char const *FilePath = "../data/test.txt";
   size_t FileSize;
   unsigned char *p = LoadFileInMemory (FilePath, &FileSize);
 
   if (p != NULL)
   {
      dump (p, FileSize);
      free (p), p = NULL;
   }
   return 0;
}


Message édité par Emmanuel Delahaye le 01-05-2005 à 20:06:28

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 01-05-2005 à 16:04:08    

manque const, cast en trop et ca fuis, tu as fais ca trop rapidement :)

Reply

Marsh Posté le 01-05-2005 à 16:04:44    

fseek(fpData, 0, SEEK_END);
plus court
rewind(fpData);

Reply

Marsh Posté le 01-05-2005 à 16:05:57    

allez je suis bon prince, je t'autorise à inclure stdlib et stdio ^__^

Reply

Marsh Posté le 01-05-2005 à 16:09:23    

il ya 2 fuites quand meme

Reply

Marsh Posté le 01-05-2005 à 16:10:28    

where ? (j'en vois une pas deux )


Message édité par sigmatador le 01-05-2005 à 16:11:59
Reply

Marsh Posté le 01-05-2005 à 16:12:54    


Code :
  1. if(!pData)
  2.         return NULL;


le fichier n'est pas fermé
 

Code :
  1. if(ulReadBytes != ulFileSize)
  2.          return NULL;


la zone pointée par pData n'est pas libèrée

Reply

Marsh Posté le 01-05-2005 à 16:13:09    

mais en meme temps j'ai gratter ca vite fait, pour lui donner les grande ligne ^^ (en general je gere mes erreurs un peu plus qu'un simple return NULL ^^)

Reply

Marsh Posté le 01-05-2005 à 16:13:40    

oops javai pas fait gaffe au fichier ^^
 
edit; voila c'est corriged ^^


Message édité par sigmatador le 01-05-2005 à 16:15:52
Reply

Marsh Posté le 01-05-2005 à 18:54:48    

Emmanuel Delahaye a écrit :



            pData = malloc (ulFileSize);
 
            if (pData != NULL)
            {
               
            }
            else
            {
               [b]free (pData), pData = NULL;[/b]
            }
 



 
tu voulais pas plutot faire fclose (fpData); ??
 

Reply

Marsh Posté le 01-05-2005 à 18:58:55    

sigmatador a écrit :

oops javai pas fait gaffe au fichier ^^
 
edit; voila c'est corriged ^^


 
voila c'est etanche, pour faire plus claire sizeof(unsigned char) vaut 1 (sizeof retourne une taillle en char) et le cast du malloc est inutile (conversion avec void* implicite)
 
pData = malloc(ulFileSize);
 
et personne n'aime rewind ?

Reply

Marsh Posté le 01-05-2005 à 20:07:44    

ah la par contre un fin mapage en mémoire.........[:el g]


---------------
NP: HTTP Error 764 Stupid coder found
Reply

Marsh Posté le 01-05-2005 à 20:09:41    

skelter a écrit :

tu voulais pas plutot faire fclose (fpData); ??


Non je libère le bloc si la lecture est incorrecte.
 
Par contre la fermeture du fichier était mal placée. Je l'ai mise au bon endroit.


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 01-05-2005 à 20:11:00    

Citation :

                 

Code :
  1. }
  2.                }
  3.             }
  4.          }
  5.          fclose (fpData), fpData = NULL;
  6.       }
  7.    }
  8.    return pData;
  9. }



 
vu le peu de complexité de la fonction, avoir un tel niveau d'imbrication me parait quand meme sacrement tirer de l'abus


Message édité par chrisbk le 01-05-2005 à 20:11:57

---------------
NP: HTTP Error 764 Stupid coder found
Reply

Marsh Posté le 01-05-2005 à 20:20:28    

edit


Message édité par skelter le 01-05-2005 à 20:24:32
Reply

Marsh Posté le 01-05-2005 à 20:22:33    

edit


Message édité par skelter le 01-05-2005 à 20:23:05
Reply

Marsh Posté le 01-05-2005 à 20:23:54    


ok maintenant c'est corrigé


Message édité par skelter le 01-05-2005 à 20:24:10
Reply

Marsh Posté le 01-05-2005 à 20:47:18    

skelter a écrit :

pour faire plus claire sizeof(unsigned char) vaut 1 (sizeof retourne une taillle en char) et le cast du malloc est inutile (conversion avec void* implicite)


 
ouai je sais mais c'est deux vieilles habitudes ^^
 
 
sinon pour le rewind j'ai la flemme de reremodifier ^^

Reply

Marsh Posté le 01-05-2005 à 20:48:41    

chrisbk a écrit :

vu le peu de complexité de la fonction, avoir un tel niveau d'imbrication me parait quand meme sacrement tirer de l'abus


 
+1, ca rend le code beaucoup moins lisible, je vois pas l'interet (enfin bon apres chacun son coding style ^^)
 
 

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed