[C++] lecture fichier de plusieurs Giga

Résolu/Fermé
grorel Messages postés 6 Date d'inscription vendredi 20 juillet 2007 Statut Membre Dernière intervention 30 octobre 2007 - 24 juil. 2007 à 13:22
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 - 26 juil. 2007 à 10:52
Salut,

je dois lire quelques bytes dans un fichier faisant plusieur Giga d'espace disque (parfois plusieurs centaines) et bien entendu, les fonctions de la classe CFile ne sont pas adaptée. En effet, la variable qui donne la fonction du fichier est un DWORD (environ 4Go).
Pour le moment, je peux, en rentrant la taille du fichier à la main, faire un Read de tout le fichier et ca prend énormément de temp. La fonction seek fonctionne sur les 4 premier Giga puis renvoie une erreur. C'est assez embetant parce que j'ai besoin de lire un byte tous les 262144 bytes .......

Donc, j'aurais besoin d'une fonction permettant de se déplacer sans lire dans le fichier et pouvant atteindre des dimensions tres importantes.

Merci beaucoup d'avance!
A voir également:

6 réponses

dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
24 juil. 2007 à 13:30
Pour dépasser la limite de 4Gb, n'y-a-t-il pas des fonctions open64, read64, lseek64 etc ?

Ca doit être ca:
Run-Time Library Reference
_lseek, _lseeki64

Moves a file pointer to the specified location.
https://www.microsoft.com/en-us/download/details.aspx?id=55984
0
grorel Messages postés 6 Date d'inscription vendredi 20 juillet 2007 Statut Membre Dernière intervention 30 octobre 2007
24 juil. 2007 à 16:20
Merci, c'est exactement ce qu'il me faut.....

....sauf que ca marche qu'avec visual .net et que je suis sous visual 6.0. (oui j'avais oublier de préciser). Donc si tu connais un équivalent pour cette version ce serait super.

Merci en tout cas de ton aide, je continue a chercher.
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
24 juil. 2007 à 16:42
lseek64 (sans i), je ne vois pas trop d'autre choix, à moins que 6.0 ne supporte pas les fichiers > 4Gb.
voir la doc.
et une option de compilation, genre largefile ?

là: https://docs.microsoft.com/en-us/previous-versions/visualstudio/visual-studio-6.0/aa246460(v=vs.60)?redirectedfrom=MSDN
c'est la doc 6.0
_lseek, _lseeki64 Reposition file pointer to given location

quoi que, mauvaise nouvelle peut-êre
http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=422910&SiteID=1

Sorry Visual C++ 6.0 is way too old for this (64bit was still pretty much a small niche market back in 1998). Visual C++ 6.0 is also no longer supported - you should upgrade to Visual C++ 2005.
0
grorel Messages postés 6 Date d'inscription vendredi 20 juillet 2007 Statut Membre Dernière intervention 30 octobre 2007
25 juil. 2007 à 09:35
La fonction _lseeki64 fonctionne sur VC++ 6.0. Mais elle est aussi lente que la fonction read de base. Je pensais pourtant qu'il y avait moyen d'accélérer le traitement de mes données si je bougais juste le pointeur (surtout que je lit un byte tous les 262144 bytes). enfin....

Donc pour se déplacer dans un fichier de plusieurs Giga, c'est _lseeki64 qu'il faut utiliser si on est rester a VC++ 6.0. Mais si on se déplace uniquement dans le sens de la lecture, ben c'est pas plus rapide finalement qu'un bon vieu read, meme si ca économise la place en mémoire du buffer.

Merci de ton aide en tout cas, je vais garder mon programme tel quel. tant pis, je lancerais mes tests la nuit et ca sera fini le matin. ;)
A+
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
26 juil. 2007 à 09:08
C'est bizarre, car le rôle de lseek c'est de se positionner directement sur le byte choisi. Ca doit être immédiat.
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
26 juil. 2007 à 10:52
C'est lseek ou le programme qui est lent ?
le probléme vient surement d'ailleurs .
faire des tests en affichant le temps avant et après le lseek.
0