Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1964 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Ecrire un fichier dans un char *

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Ecrire un fichier dans un char *

n°1065888
El tourist​o
Posté le 29-04-2005 à 15:53:42  profilanswer
 

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.

mood
Publicité
Posté le 29-04-2005 à 15:53:42  profilanswer
 

n°1065892
cesarr89
Posté le 29-04-2005 à 15:54:48  profilanswer
 

tu as cherché sur google avant?

n°1065898
skelter
Posté le 29-04-2005 à 15:59:39  profilanswer
 

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

n°1065901
matafan
Posté le 29-04-2005 à 16:00:13  profilanswer
 

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.

n°1065926
skelter
Posté le 29-04-2005 à 16:09:38  profilanswer
 

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

n°1065928
El tourist​o
Posté le 29-04-2005 à 16:10:43  profilanswer
 

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

n°1065931
El tourist​o
Posté le 29-04-2005 à 16:12:01  profilanswer
 

skelter a écrit :

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


c'est a dire ??

n°1065936
Elmoricq
Modérateur
Posté le 29-04-2005 à 16:15:42  profilanswer
 

El touristo a écrit :

c'est a dire ??


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

n°1065944
skelter
Posté le 29-04-2005 à 16:18:37  profilanswer
 

et utilise fopen, fread, ...
man stdio

n°1066097
Emmanuel D​elahaye
C is a sharp tool
Posté le 29-04-2005 à 17:58:05  profilanswer
 

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/
mood
Publicité
Posté le 29-04-2005 à 17:58:05  profilanswer
 

n°1066626
Sve@r
Posté le 30-04-2005 à 11:53:10  profilanswer
 

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.
n°1067695
sigmatador
Posté le 01-05-2005 à 15:54:01  profilanswer
 

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
n°1067702
Emmanuel D​elahaye
C is a sharp tool
Posté le 01-05-2005 à 16:02:43  profilanswer
 

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/
n°1067704
skelter
Posté le 01-05-2005 à 16:04:08  profilanswer
 

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

n°1067706
skelter
Posté le 01-05-2005 à 16:04:44  profilanswer
 

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

n°1067708
sigmatador
Posté le 01-05-2005 à 16:05:57  profilanswer
 

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

n°1067714
skelter
Posté le 01-05-2005 à 16:09:23  profilanswer
 

il ya 2 fuites quand meme

n°1067718
sigmatador
Posté le 01-05-2005 à 16:10:28  profilanswer
 

where ? (j'en vois une pas deux )


Message édité par sigmatador le 01-05-2005 à 16:11:59
n°1067724
skelter
Posté le 01-05-2005 à 16:12:54  profilanswer
 


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

n°1067725
sigmatador
Posté le 01-05-2005 à 16:13:09  profilanswer
 

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 ^^)

n°1067726
sigmatador
Posté le 01-05-2005 à 16:13:40  profilanswer
 

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


Message édité par sigmatador le 01-05-2005 à 16:15:52
n°1067827
skelter
Posté le 01-05-2005 à 18:54:48  profilanswer
 

Emmanuel Delahaye a écrit :



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



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

n°1067835
skelter
Posté le 01-05-2005 à 18:58:55  profilanswer
 

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 ?

n°1067928
chrisbk
-
Posté le 01-05-2005 à 20:07:44  profilanswer
 

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


---------------
NP: HTTP Error 764 Stupid coder found
n°1067929
Emmanuel D​elahaye
C is a sharp tool
Posté le 01-05-2005 à 20:09:41  profilanswer
 

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/
n°1067931
chrisbk
-
Posté le 01-05-2005 à 20:11:00  profilanswer
 

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
n°1067935
skelter
Posté le 01-05-2005 à 20:20:28  profilanswer
 

edit


Message édité par skelter le 01-05-2005 à 20:24:32
n°1067937
skelter
Posté le 01-05-2005 à 20:22:33  profilanswer
 

edit


Message édité par skelter le 01-05-2005 à 20:23:05
n°1067940
skelter
Posté le 01-05-2005 à 20:23:54  profilanswer
 


ok maintenant c'est corrigé


Message édité par skelter le 01-05-2005 à 20:24:10
n°1067978
sigmatador
Posté le 01-05-2005 à 20:47:18  profilanswer
 

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 ^^

n°1067979
sigmatador
Posté le 01-05-2005 à 20:48:41  profilanswer
 

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 ^^)
 
 

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Ecrire un fichier dans un char *

 

Sujets relatifs
exécuter un fichier java sans jbuilderpb Upload fichier tout bête !
[Demande] Envoie de fichierInsérer le contenu d'un fichier TXT dans une table...
Copier le contenu d'un fichier dans un bufferImportation fichier texte en excel avec plus de 256 colonnes
UPLOAD de fichier fonction ftprécupérer une chaines de caractère d'un fichier texte
petit probleme d'ecriture dans un fichierComment zipper un fichier à partir de la fonction Shell
Plus de sujets relatifs à : Ecrire un fichier dans un char *


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR