[C++] Récupérer la taille d'un fichier binaire

Récupérer la taille d'un fichier binaire [C++] - C++ - Programmation

Marsh Posté le 07-11-2010 à 23:26:47    

Bonsoiiiir \o/
 
Bon, j'suis en plein dans la prog d'une DLL, et je dois récupérer des valeurs dans un fichier en binaire (ça marche niquel), maintenant faut que j'exécute en boucle cette action (loop for vu que je rempli un tableau 2D), mais comment je peux récupérer la taille du fichier ? Histoire que ma loop for marche bien :D
 
Merci d'votre aide :jap:


---------------
Perhaps you don't deserve to breathe
Reply

Marsh Posté le 07-11-2010 à 23:26:47   

Reply

Marsh Posté le 08-11-2010 à 00:48:41    

En supposant que tu utilises l'api windows, il y a http://msdn.microsoft.com/en-us/li [...] 85%29.aspx
Sinon, si tu contrôles le format du fichier binaire, tu peux y mettre au début/ a la fin une structure pour indiquer le nombre d'enregistrement qu'il contient...

Reply

Marsh Posté le 08-11-2010 à 01:24:40    

Pas moyens via la librairie fstream ?

 

edit : c'est bon, voilà mon code :D

 
Code :
  1. //FILESIZE
  2. f.seekg (0,ios_base::end);
  3. size=f.tellg();
  4. f.seekg (0,ios_base::beg);
 

par contre, comment je peux faire passer un tableau d'une fonction à l'autre ?

Message cité 1 fois
Message édité par Terminapor le 08-11-2010 à 02:09:49

---------------
Perhaps you don't deserve to breathe
Reply

Marsh Posté le 08-11-2010 à 08:24:30    

en le passant en paramètre :€
Qu'entends tu par tableau ? std::vector j'espere ?

Reply

Marsh Posté le 08-11-2010 à 10:22:14    

Terminapor a écrit :

Pas moyens via la librairie fstream ?
 
edit : c'est bon, voilà mon code :D
 

Code :
  1. //FILESIZE
  2. f.seekg (0,ios_base::end);
  3. size=f.tellg();
  4. f.seekg (0,ios_base::beg);


 
par contre, comment je peux faire passer un tableau d'une fonction à l'autre ?


 
pour une application 32 bits, ton code ne fonctionnera pas pour les fichiers de plus de 4Go, tu es donc conscient que ce que tu as écrit devrait être considéré comme faux ? :)


---------------
last.fm
Reply

Marsh Posté le 08-11-2010 à 12:10:41    

Joel F a écrit :

en le passant en paramètre :€
Qu'entends tu par tableau ? std::vector j'espere ?


un array tout con de cette forme : tab[x][y] :D
 
Donc j'suis sensé faire €montableau[x][y] ?
 
j'ai testé en faisant pointer sur ma fonction, le truc c'est qu'il faut que je l'exporte en double, et code::blocks me dit ça :
 
 error: invalid types `double[8][0u][double]' for array subscript :'(
 

theshockwave a écrit :


 
pour une application 32 bits, ton code ne fonctionnera pas pour les fichiers de plus de 4Go, tu es donc conscient que ce que tu as écrit devrait être considéré comme faux ? :)


Oui mais c'est pas grave (pour ma part), les fichiers qu'utilisera ma dll fera quoi... 8KB max ? jamais ça dépassera le giga :D


---------------
Perhaps you don't deserve to breathe
Reply

Marsh Posté le 08-11-2010 à 13:50:29    

L'usage habituel, c'est fstat sous unix linux et son pote _fstat (et sa famille _fstat32, _fstat64, _fstati64, _fstat32i64, _fstat64i32) sous windows.  
Si tu ne veux que du code windows, tu as aussi _filelength, (et _filelengthi64) qui sont des versions directes de ce qu'on peut faire avec _fstat (et _fstati64)
A+,


Message édité par gilou le 08-11-2010 à 13:52:20

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 08-11-2010 à 15:22:10    

Pour utiliser les fonctions standard en 64 bits, il faut ajouter cela à la compilation :  
 

Code :
  1. -D_FILE_OFFSET_BITS=64


 
si ce n'est pas mis, un fread (ou autre) échouera après 2GO.
 
Je ne sais pas si c'est nécessaire pour fstat.

Reply

Marsh Posté le 08-11-2010 à 17:04:29    

Ben comme je disais, ça dépassera jamais le giga le fichier que je "scan", donc la fonction que j'ai posté plus haut marche parfaitement :D

 

Maintenant, j'ai une tite question :D

 

Donc, je dois appeler ma DLL et lui dire de stocker toute les donnés d'un fichier définie dans un array 2D, no problem.
Maintenant, que se passera-t-il si j'appelle deux fois cette fonction avec deux fichiers différent ? ça ré-écrira sur mon ancien array, ou bien les pointeur de ces arrays seront différent :??:

 

Merci d'vot' aide :)


Message édité par Terminapor le 08-11-2010 à 17:07:20

---------------
Perhaps you don't deserve to breathe
Reply

Marsh Posté le 08-11-2010 à 17:27:46    

cela dépend comment est déclaré ton tableau. Sans code, on ne pourra pas te dire grand chose.

Reply

Marsh Posté le 08-11-2010 à 17:27:46   

Reply

Marsh Posté le 08-11-2010 à 17:33:56    

yes, voilà :  
 

Code :
  1. #include <iostream>
  2. #include <fstream>
  3. #include <string>
  4. #include <cstdio>
  5. using namespace std;
  6. char animationdata[8][0];
  7. DLL_EXPORT double animation_load()
  8. {
  9. // j'met dans le tableau mon bordel ambulant
  10. }
  11. DLL_EXPORT double animation_get(double _x, double _y)
  12. {
  13.     return(double) animationdata[_x][_y];
  14. }


 
Mais il me dit que la seul ligne de animation_get (second dll_export) est pas bonne  
"error: invalid types `char[8][0u][double]' for array subscript"
 
Que faire ? :(  
j'ai déjà essayé de changer mon tableau en double ou quoi, mais ça n'y change rien


---------------
Perhaps you don't deserve to breathe
Reply

Marsh Posté le 08-11-2010 à 17:35:36    

ton tableau est déclaré en variable globale, chaque appel en écriture sur celui-ci écrasera les valeurs précédentes.

Reply

Marsh Posté le 08-11-2010 à 17:36:35    

ouais donc faut le mettre dans la fonction animation_load() c'est ça ?

 

Et pour le problème de la dernière ligne ?

 

edit : bon, j'l'ai faite marché finalement, mais quand j'assigne des valeurs à mon tableau......... ça marche paaaass :(

 

f.read((char*) &absdata, 2);
 int pos = absdata*sign;
 animationdata[0][frame] = absdata*sign;

 

vlah le code, frame est à 0, sign à -1, halp !


Message édité par Terminapor le 08-11-2010 à 22:04:12

---------------
Perhaps you don't deserve to breathe
Reply

Sujets relatifs:

Leave a Replay

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