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

  FORUM HardWare.fr
  Programmation
  C

  [C] lire un fichier......mon dieu aidez moi !!

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C] lire un fichier......mon dieu aidez moi !!

n°1727313
freepopo
Posté le 01-05-2008 à 18:37:06  profilanswer
 

Bonjour, j'ai un problème apparement très simple, je me suis pris la tête toute la nuit dernière et aujourdh'ui sur ce truc, impossible de débloquer la situation donc je ne sais plus quoi faire, permettez-moi de vous soumettre la chose.
 
Je souhaite tout simplement lire dans un fichier (de n'importe quel format), mettre ce que je lis dans un buffer de données de type char (typé ainsi que je pourrais lire octet par octet).
Voici ma fonction :
 
char* fichier_lire_bloc(char *nom_fichier,int size)
{  
       int f= open(nom_fichier, O_RDONLY);
      char *donnees=(char*)malloc(sizeof(char)*size);
   
     if(read(f, donnees, size) < 0)
     {
            perror("fichier_lire_bloc" );
            close(f);
            return -1;
     }*/
     printf(" sizeof(donnees) lire_bloc2 :  %d\n",(int)sizeof(donnees2));
     printf("voici les données \n %s \n",donnees2);
   
       close(f);
 
       return donnees;
}
 
Simple non ? le problème est qu'a l'affichage sur l'écran, je n'ai que 4 caractères d'écrit et si j'essaye d'écrire mon buffer dans un autre fichier (ce qui est mon but), sa ne m'écrit que ces quelques caractères.
J'ai tout essayé, de déclarer mon buffer en static (char donnees[4096]), lire d'autres taille (je voudrais lire des blocs de 4096)...
 
 
Auriez-vous une solution, y a t'il quelque chose qui vous saute aux yeux ? Je n'en peux plus de m'arracher les cheveux sur cette partie, je deviens fou  :(  
Merci d'avance pour vos réponse

mood
Publicité
Posté le 01-05-2008 à 18:37:06  profilanswer
 

n°1727319
Anonymouse
Posté le 01-05-2008 à 18:56:21  profilanswer
 

Code :
  1. FILE* descripteurFichier=NULL;
  2. int nombreCaracteres=10;
  3. char* buffer=NULL;
  4. descripteurFichier=fopen(path, "rb" );
  5. if(descripteurFichier==NULL)
  6. {
  7.  return -1;
  8. }
  9. //on alloue un buffer en conséquence
  10. buffer=malloc(sizeof(char)*nombreCaracteres);
  11. //on charge le fichier dans le buffer
  12. if(fread (buffer, sizeof(char), nombreCaracteres, descripteurFichier)<nombreCaracteres)
  13. {
  14.  perror("Impossible d'ouvrir le fichier" );
  15.  free(buffer);
  16.  close(descripteur)
  17.  return -1;
  18. }


 
Je suis pas un speialiste du C mais voila un code réalisé il y'a quelques temps qui fonctionnait bien. Il a l'avantage d'utiliser la fonction fopen plus portable (si mes souvenirs sont bons) que open.
 
Après je dis peut être une connerie mais je sais qu'un pointeur est sur certain systèmes codé sur quatre octets. Un char étant codé sur un octet une erreur telle que décrite me fait penser que tu essaye d'imprimer un pointeur et non pas ta chaine de char.
 
As tu essayé un strlen()??


Message édité par Anonymouse le 01-05-2008 à 18:58:19
n°1727335
Gf4x3443
Killing perfection
Posté le 01-05-2008 à 19:57:52  profilanswer
 

1 - aujourd'hui en 2008, ca ne sert à rien de caster les (void *) sur malloc(), à part cacher des problèmes de typage.

 

2 - sizeof est un opérateur de compilation, il ne pourra jamais te retourner le nombre d'éléments dans ton buffer de lecture. En l'occurence, il te retournera 4, qui est bien la taille d'un pointeur de char (une adresse 32 bits).

 

3 - si tu veux utiliser proprement read(), tu dois vérifier le code de retour, qui te donnera le nombre d'octets lus (si la valeur de retour est >0), 0 si tu atteins la fin de fichier (EOF), ou éventuellement -1 s'il y a une erreur. Tu peux effectivement demander de lire 256 octets, mais au final en avoir moins (si tu es à moins de 256 octets de la fin de fichier, par exemple).


Message édité par Gf4x3443 le 01-05-2008 à 19:58:45
n°1727349
gilou
Modérateur
Modzilla
Posté le 01-05-2008 à 20:31:44  profilanswer
 

freepopo, tu as des raisons particulieres pour employer open et read? tu fais du systeme de bas niveau, ou ça t'est imposé? sinon, utilises plutot fopen, fread.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°1727384
freepopo
Posté le 01-05-2008 à 21:48:48  profilanswer
 

Merci pour vos réponse, je vais de ce pas essayer ce que vous m'avez préconiser.
 
Je fais de la prog systeme C, c'est un gros gros projet de logiciel peer-to-peer ou je dois tout coder moi-meme. Je vais zieuter du coté de fread.

n°1727392
Gf4x3443
Killing perfection
Posté le 01-05-2008 à 22:01:07  profilanswer
 

freepopo a écrit :

Merci pour vos réponse, je vais de ce pas essayer ce que vous m'avez préconiser.

 

Je fais de la prog systeme C, c'est un gros gros projet de logiciel peer-to-peer ou je dois tout coder moi-meme. Je vais zieuter du coté de fread.

 

Amha, dans ce cas, vu que c'est du P2P, tu ferais mieux de laisser tomber les fonctions f* (fread, fopen, ...). Ce sont des fonctions qui opèrent sur des streams (ce sont des fonctions stdio), et si par mégarde tu as le malheur d'oublier un fflush() quelque part, tu vas t'en bouffer les doigts (un exemple typique: des écritures bufferisées mais non flushés, qui font que tu te retrouves rapidement sur des appels à select() bloquant à l'autre bout).

 

Edit: read() et open() n'ont pas ce problème, elles ne sont pas streamées. Pour une raison évidente, ce sont des syscalls.

Message cité 1 fois
Message édité par Gf4x3443 le 01-05-2008 à 22:03:10
n°1727398
tpierron
Posté le 01-05-2008 à 22:17:58  profilanswer
 

Et accessoirement pourquoi dans ton code tu essayes d'afficher "donnees2", alors que dans ta fonction tu manipules "donnees" ?

n°1727434
gilou
Modérateur
Modzilla
Posté le 01-05-2008 à 23:48:48  profilanswer
 

A priori, ce que tu veux est quelque chose de ce genre ci:

Code :
  1. char* fichier_lire_bloc(char *nom_fichier, int size)
  2.   FILE *f;
  3.   char *donnees = 0;
  4.  
  5.   if (f = fopen(nom_fichier, "r" ))
  6.     {
  7.       if (donnees = malloc(size))
  8.         {
  9.           if (fread(donnees, size, 1, f))
  10.             {
  11.               /* Ici tu fais ton test, mais celui que tu as ecrit n'est pas bon
  12.                  printf(" sizeof(donnees) lire_bloc2 :  %d\n",(int)sizeof(donnees));
  13.                  printf("voici les données \n %s \n",donnees); */
  14.             }
  15.           else
  16.             {
  17.               perror("fichier_lire_bloc: cannot read file" );
  18.               free(donnees);
  19.               donnees = 0;
  20.             }
  21.         }
  22.       else
  23.         {
  24.           perror("fichier_lire_bloc: cannot allocate buffer" );
  25.         }
  26.       fclose(f);
  27.     }
  28.   else
  29.     {
  30.       perror("fichier_lire_bloc: cannot open file" );
  31.     }
  32.   /* On retourne un pointeur nul si on a échoué, ce qui est consistant avec
  33.      le prototype, et facile a tester dans l'appelante */
  34.   return donnees;
  35. }


Pour tes tests:
printf(" sizeof(donnees) lire_bloc2 :  %d\n",(int)sizeof(donnees)); ca va te donner la taille d'un char * sur ton systeme, je ne suis pas sur que ce soit ce que tu cherches.
printf("voici les données \n %s \n",donnees); ca risque de foirer si tu n'as pas de '\0' en fin de buffer, car je ne sais pas comment sont tes données.
Je serais toi, je:
recupérerais la taille lue dans une variable definie auparavant:  
if (donneelue = fread(donnees, size, 1, f))
il va falloir gerer le '\0' final a la main si tu veux employer printf, et donc, soit allouer au départ un buffer de size+1 (si ca ne gene pas par la suite pour le buffer retourné) soit copier tes données dans un buffer de taille size+1 pour utilisation avec printf.
A+,


Message édité par gilou le 01-05-2008 à 23:59:38

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°1727437
gilou
Modérateur
Modzilla
Posté le 01-05-2008 à 23:52:16  profilanswer
 

Gf4x3443 a écrit :


 
Amha, dans ce cas, vu que c'est du P2P, tu ferais mieux de laisser tomber les fonctions f* (fread, fopen, ...). Ce sont des fonctions qui opèrent sur des streams (ce sont des fonctions stdio), et si par mégarde tu as le malheur d'oublier un fflush() quelque part, tu vas t'en bouffer les doigts (un exemple typique: des écritures bufferisées mais non flushés, qui font que tu te retrouves rapidement sur des appels à select() bloquant à l'autre bout).
 
Edit: read() et open() n'ont pas ce problème, elles ne sont pas streamées. Pour une raison évidente, ce sont des syscalls.

Certes, mais le proto de sa fonction a un nom de fichier, pas un fd, alors...
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°1727440
Gf4x3443
Killing perfection
Posté le 01-05-2008 à 23:59:05  profilanswer
 

gilou a écrit :

Certes, mais le proto de sa fonction a un nom de fichier, pas un fd, alors...


 
Tout à fait d'accord [:delarue6]
 
Cf ton premier post :o :
 

gilou a écrit :

freepopo, tu as des raisons particulieres pour employer open et read? tu fais du systeme de bas niveau, ou ça t'est imposé? sinon, utilises plutot fopen, fread.
A+,


mood
Publicité
Posté le 01-05-2008 à 23:59:05  profilanswer
 

n°1727442
gilou
Modérateur
Modzilla
Posté le 02-05-2008 à 00:09:36  profilanswer
 

Oui, enfin, quand je parlais de prog systeme, je pensais vraie prog systeme unix, parce que la, c'est de l'applicatif avec eventuellement des streams, s'il fait du P2P.
Alors, la multiplication des syscalls n'étant pas recommandée, et fes fXXX etant considérés comme plus portables...autant savoir gerer les fflush ;)
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°1727462
freepopo
Posté le 02-05-2008 à 00:53:00  profilanswer
 

Merci pour tes précisions mais je ne souhaite pas lire spécialement des caractères , ce ne sont pas des fichiers textes que je lie mais tout (.mp3, .doc etc) et je les transfere en utilisant un buffer de caractere qui a l'avantage "d'écrire octet par octet".
J'affiche la taille du buffer seulement a titre informatif, c'étiat juste pour débuguer et effectivement sa me renvoi 4, la taille du pointeur.

n°1727463
gilou
Modérateur
Modzilla
Posté le 02-05-2008 à 01:02:47  profilanswer
 

Citation :

Merci pour tes précisions mais je ne souhaite pas lire spécialement des caractères

:??: c'est une allusion a quoi?
 
Pour ta fonction, il va falloir tenir compte de la taille des données lues:
Si tu ne lis pas size octets de donnée, consideres tu que c'est une erreur ou non?
- si oui, tu peux remplacer le test
if (fread(donnees, size, 1, f))
par
if (fread(donnees, size, 1, f) == size)
pour ne retourner le buffer que si il est plein
- si non il va falloir retourner le buffer et la taille reellement lue...
 
A+,


Message édité par gilou le 02-05-2008 à 01:04:10

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°1727464
Gf4x3443
Killing perfection
Posté le 02-05-2008 à 01:04:46  profilanswer
 

freepopo a écrit :

Merci pour tes précisions mais je ne souhaite pas lire spécialement des caractères , ce ne sont pas des fichiers textes que je lie mais tout (.mp3, .doc etc)

 

fread et fopen sont tout à fait utilisable pour des flux binaires. Le C se fiche un peu de savoir si ce sont des char ASCII ou pas, lui ne voit que des nombres.

 
freepopo a écrit :

et je les transfere en utilisant un buffer de caractere qui a l'avantage "d'écrire octet par octet".

 

Si je comprends bien ta phrase, tu empiles des buffers. Les fonctions f* gèrent déjà un buffer, donc tu empiles des fonctionnalités pour pas grand chose.

 

Edit: et comme te le montre gilou au dessus, tu complexifies ton code pour pas grand chose. A toi de voir ou tu veux gérer tout ca.

Message cité 1 fois
Message édité par Gf4x3443 le 02-05-2008 à 01:06:27
n°1727466
gilou
Modérateur
Modzilla
Posté le 02-05-2008 à 01:13:04  profilanswer
 

Gf4x3443 a écrit :


 
fread et fopen sont tout à fait utilisable pour des flux binaires. Le C se fiche un peu de savoir si ce sont des char ASCII ou pas, lui ne voit que des nombres.
 

Tout a fait. :jap:  
Par contre, j'essayais de lui expliquer plus haut que pour du binaire, fprintf n'est pas particulierement adapté.
( sa ligne printf("voici les données \n %s \n",donnees); ne colle pas pour des données binaires )
S'il tient a afficher le contenu de son buffer pour tracer et debugger, il pourrait plutot passer par un fwrite sur stdout par exemple.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°1727467
Gf4x3443
Killing perfection
Posté le 02-05-2008 à 01:16:42  profilanswer
 

gilou a écrit :

Tout a fait. :jap:  
Par contre, j'essayais de lui expliquer plus haut que pour du binaire, fprintf n'est pas particulierement adapté.
( sa ligne printf("voici les données \n %s \n",donnees); ne colle pas pour des données binaires )


 
Ah pardon.
 
Oui ca aussi, effectivement :D


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

  [C] lire un fichier......mon dieu aidez moi !!

 

Sujets relatifs
chemin du dossier contenant le fichier ExcelProblème avec Visual C++
class non reconnue depuis un autre fichierreference a un autre fichier c++
Binding entre un schéma XSD et un ensemble de classes C++Récupérer une ligne d'un fichier
Base de donnée pour remplacer lignes d'un fichier textegrep et fichier
Vector en C++ - Optimisation de la rechercheRemplacement de caractères dans fichier
Plus de sujets relatifs à : [C] lire un fichier......mon dieu aidez moi !!


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