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

  FORUM HardWare.fr
  Programmation

  [c] bufferiser un fichier

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[c] bufferiser un fichier

n°81139
otb82
Fear is Failure
Posté le 12-12-2001 à 22:17:18  profilanswer
 

comment ca marche ?!

mood
Publicité
Posté le 12-12-2001 à 22:17:18  profilanswer
 

n°81187
LetoII
Le dormeur doit se réveiller
Posté le 13-12-2001 à 07:24:56  profilanswer
 

heu comment ça marche quoi, pourais tu être un peu plus précis?

n°81197
Carbon_14
Posté le 13-12-2001 à 09:43:58  profilanswer
 

Ca marche comme ça peut ? :D  
 
La question est-elle "comment stocker un fichier en mémoire pour pas avoir à le relire à chaque accès" ?

n°81209
El_gringo
Posté le 13-12-2001 à 11:02:51  profilanswer
 

bah, y faut stocker tout le contenu du fichier dans
char szBufFile[MAXFIC]
MAXFIC étant la taille maxi de ton fichier en octets.
ensuite, tu fais un bête fscanf dans ton buffer j'imagine (ça, j'utilise qd même pas trop... les MFC c vachement mieux :-D)

 

[edtdd]--Message édité par El_Gringo--[/edtdd]

n°81246
otb82
Fear is Failure
Posté le 13-12-2001 à 13:29:28  profilanswer
 

El_Gringo a écrit a écrit :

bah, y faut stocker tout le contenu du fichier dans
char szBufFile[MAXFIC]
MAXFIC étant la taille maxi de ton fichier en octets.
ensuite, tu fais un bête fscanf dans ton buffer j'imagine (ça, j'utilise qd même pas trop... les MFC c vachement mieux :-D)  




et c koi les MFC ??

n°81254
otb82
Fear is Failure
Posté le 13-12-2001 à 13:46:57  profilanswer
 

CARBON_14 a écrit a écrit :

Ca marche comme ça peut ? :D  
 
La question est-elle "comment stocker un fichier en mémoire pour pas avoir à le relire à chaque accès" ?  




yep c tt a fais ca

n°81255
Carbon_14
Posté le 13-12-2001 à 13:51:00  profilanswer
 

Stocker le contenu d'un fichier en mémoire est "facile" (ouvrir en mode binaire pour éviter de perdre des caractères) quand il y tient. C'est plus rusé si le fichier est très gros, car faut découper (je connais que le principe) et gérer les adresses des bouts chargés pour s'y retrouver....

n°81257
otb82
Fear is Failure
Posté le 13-12-2001 à 13:53:29  profilanswer
 

CARBON_14 a écrit a écrit :

Stocker le contenu d'un fichier en mémoire est "facile" (ouvrir en mode binaire pour éviter de perdre des caractères) quand il y tient. C'est plus rusé si le fichier est très gros, car faut découper (je connais que le principe) et gérer les adresses des bouts chargés pour s'y retrouver....  




c koi le principe ?
apres le fopen tu fais koi ?

n°81315
LetoII
Le dormeur doit se réveiller
Posté le 13-12-2001 à 16:08:35  profilanswer
 

Y a un truc qui est super c la doccumentation, ce genre de truc est expliqué dans nimportequel bouquin de programmation ou tutorial sur le net.... enfin on va quand même te donner la solution:
 
#include <stdio.h>
 
int main()
{
   FILE          *pFile;
   int            taille
   unsigned char *buffer;
 
   buffer=NULL;
   if(pFile=fopen("monFichier","rb" ))
   {
      fseek(pFile,0,SEEK_END);
      taille=ftell(pFile);
      buffer=(unsigned char*)malloc(taille);
       
      fread(buffer,1,taille,pFile);
      fclose(pFile);
   }
}

 

[edtdd]--Message édité par LetoII--[/edtdd]

n°81458
mogi
Posté le 14-12-2001 à 10:08:18  profilanswer
 

la "bufferisation" ne se fait pas obligatoirement d'un seul bloc ! typiquement, on bufferise par morceaux (taille fixée) : on lit X caractères que l'on met dans un buffer, dès que l'on a besoin de caractères supplémentaires, on lit les X caractères suivants. tout le pb est dans la gestion des mots qui commencent à la fin d'un bloc et finissent dans le suivant...
 
d'ailleurs, si vous utilisez un FILE *, hé bien, hé-hé-hé, inutile de bufferiser, ça l'est déjà :D
 
il me semble que dans le K&R (Kernighan et Ritchie) c'est expliqué comment ça marche... ouais, attend, je l'ai là...
 "feuillette-feuillette-feuillette-feuillette-feui
llette-feuillette-feuillette-feuillette-feuillette
..."  
 
bingo : chapitre 8, dans la 2nde édition anglaise, c'est page 169.
 
Mogi.
 
ps : il manque un 'tit fseek dans le prog de Leto II :
 
     fseek(pFile,0,SEEK_END);  
     taille=ftell(pFile);
     fseek(pFile,0,SEEK_SET);  
     buffer=(unsigned char*)malloc(taille);  
                         
     fread(buffer,1,taille,pFile);

mood
Publicité
Posté le 14-12-2001 à 10:08:18  profilanswer
 

n°81526
LetoII
Le dormeur doit se réveiller
Posté le 14-12-2001 à 13:34:33  profilanswer
 

exacte, ça aide de se remettre au début du fichier pour lire :)

n°81537
Tomate
Posté le 14-12-2001 à 14:17:16  profilanswer
 

au fait, faut jamais caster malloc....

n°81538
godbout
Génial.
Posté le 14-12-2001 à 14:19:50  profilanswer
 

tomate77 a écrit a écrit :

au fait, faut jamais caster malloc....  




 
:??:

n°81542
LetoII
Le dormeur doit se réveiller
Posté le 14-12-2001 à 14:29:54  profilanswer
 

tomate77 a écrit a écrit :

au fait, faut jamais caster malloc....  




 
et pourquoi don?

n°81543
godbout
Génial.
Posté le 14-12-2001 à 14:34:07  profilanswer
 

perso je caste, je caste, je caste, je caste, je caste, ....:D

n°81571
mogi
Posté le 14-12-2001 à 15:13:20  profilanswer
 

Godbout a écrit a écrit :

perso je caste, je caste, je caste, je caste, je caste, ....:D  




 
tout pareil... du cast, du cast, du cast :D

n°81583
Carbon_14
Posté le 14-12-2001 à 15:39:55  profilanswer
 

Moi, je caste aussi...

n°81584
LetoII
Le dormeur doit se réveiller
Posté le 14-12-2001 à 15:43:51  profilanswer
 

faut qu'il arréte de fumer tomate77 :)

n°140598
Tomate
Posté le 17-05-2002 à 18:26:58  profilanswer
 

pk parce que malloc renvoie un void *, qui n a jamais besoin d etre caste...
 
sinon pk renvoyer un void *
 
le cast c est mal

n°140653
LeGreg
Posté le 17-05-2002 à 21:18:37  profilanswer
 

tomate77 a écrit a écrit :

pk parce que malloc renvoie un void *, qui n a jamais besoin d etre caste...
sinon pk renvoyer un void *
le cast c est mal  




 
En fait.. vous avez tous les deux raison!
 
En C, au départ il n'y avait que des char *
donc malloc renvoyait un char * qu'il fallait caster.
 
Puis les gens du C se sont dit "ce serait bien qu'on ait
un pointeur universel", puisque de toute facon C est assez faiblement type comme langage. Donc ils ont inventé le void *.
et la caracteristique de void * c'est qu'on peut caster
tout pointeur en void * et void * peut etre casté en tout pointeur.
donc  
void * mama;
char * toto = mama; // c'est valide en C
mama = toto; // c'est valide en C
 
Puis est arrivé C++ qui pour embeter tout le monde a décidé
d'être plus fortement typé, d'empêcher des conversions dangereuses (surtout avec l'arrivée des différents types de cast). Donc en C++, il est légal de caster implicitement
tout pointeur en void * (le pointeur générique)
par contre l'inverse n'est plus possible sans un cast explicite.
donc en C++, il faut caster explicitement sinon ca plante:
char * toto = (char*) malloc(n* sizeof(char));  
 
Vous allez dire: oui mais a quoi ca sert d'utiliser malloc en C++
quand on a new qui fait le boulot et qui appelle le constructeur et qui renvoie le bon type de pointeur?
Ben en fait new par défaut est implanté avec malloc. Donc il reste présent tout de même, il est d'ailleurs possible de surcharger l'opérateur new, et de faire soi-meme l'allocation.
 
De plus, on peut écrire des programmes C-Style en C++ pour
je ne sais quelle raison, donc malloc ca existe toujours.
 
A+
LEGREG

n°140760
HelloWorld
Salut tout le monde!
Posté le 18-05-2002 à 03:51:55  profilanswer
 

Citation :

au fait, faut jamais caster malloc....


 
http://www.isty-info.uvsq.fr/~rume [...] 2.html#q_1
 

Citation :

la "bufferisation" ne se fait pas obligatoirement d'un seul bloc ! typiquement, on bufferise par morceaux (taille fixée) : on lit X caractères que l'on met dans un buffer, dès que l'on a besoin de caractères supplémentaires, on lit les X caractères suivants. tout le pb est dans la gestion des mots qui commencent à la fin d'un bloc et finissent dans le suivant...  
 
d'ailleurs, si vous utilisez un FILE *, hé bien, hé-hé-hé, inutile de bufferiser, ça l'est déjà :D


 
Mais ... c'est pas à l'OS de se charger de tout cela ? Il se fait sa popote ... en optimisant à l'aide de la pagination et autre (plusieurs processus lisant le même fichier partageront le même "buffer" ...)
Je dirais même : bufferiser un fichier, c'est *mal*, car c'est déjà fait par l'OS, et on le refait une seconde fois, bref on bouffe de le mémoire pour rien (et en plus on perd du temps en recopies inutiles ...)
A moins que quelque chose m'ait échappé ...


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
mood
Publicité
Posté le   profilanswer
 


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

  [c] bufferiser un fichier

 

Sujets relatifs
Envoyer un fichier attaché par mail en php[gawk] remplacer une chaine de caracteres ds un fichier texte
[mySQL] c'est surement con, mais j'ai un fichier .sql...[BATCH] créer un fichier sous DOS ?
[PHP] Header() -- forcer le nom du fichier en téléchargment[VB] Acces aux fichier
[c/c++]Effacer un fichierRenommer un fichier avec les interruptions.
ShFileOperation et fichier *[JAVA-SERVLET] changer dynamique le nom d'un fichier à télécharger
Plus de sujets relatifs à : [c] bufferiser un fichier


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