[C] Déplacer dans un fichier de 50Go ? [Résolu/Fermé]

Signaler
Messages postés
125
Date d'inscription
dimanche 10 août 2008
Statut
Membre
Dernière intervention
7 janvier 2013
-
dubcek
Messages postés
18015
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
17 janvier 2020
-
Bonjour à tous,

j'ai un programme en C qui me permet d'écrire des données dans un fichier. Pour cela j'utilise la fonction fseek(File,Offset, depart) pour me deplacer. Le probleme est que je n'arrive pas à depasser une taille de 2Go pour mon fichier. Je sais ke c'est un probleme d'Offset qui est de type long. Donc je cherche si quelqu'un connait une fonction ou astuce en C pour se deplacer dans les fichiers de grande taille.
J'en ai vraiment besoin merci.

5 réponses

Messages postés
105
Date d'inscription
vendredi 20 juin 2008
Statut
Membre
Dernière intervention
31 mars 2011
14
Salut,

regarde ce post je pense qu'il a eu le meme probleme que toi
http://www.commentcamarche.net/forum/affich-10483231-langage-c-ftell-fseek

j'espere que ca t'aidera


bye
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 79673 internautes nous ont dit merci ce mois-ci

youscoul
Messages postés
125
Date d'inscription
dimanche 10 août 2008
Statut
Membre
Dernière intervention
7 janvier 2013
4
Merci, en fait j'avais vu ce post avant. Mais je ne comprenais pas comment il a resolu son probleme car il n a vraiment pas posté sa solution. Voici ce que j'avais fait pour l'offset dans mon fseek: fseek(File, offset, SEEK_SET) avec:
offset=(Compteur[categorie]+(categorie-1)*10000)*NbreOctet. Où categorie varie de 1 à 5000000, et à chaque categorie j'ai un compteur associé qui permet de memoriser le nombre de fois où cette categorie s'est produite. Dans mon cas ici, la difference avec l'autre post que tu m'as passé est que: le stockage est vraiment aleatoire car depend de la categorie qui est tiré. Merci encore et je repete que j'ai pas compris l'autre forum.
Edwyn
Messages postés
105
Date d'inscription
vendredi 20 juin 2008
Statut
Membre
Dernière intervention
31 mars 2011
14
int
fseek(FILE *stream, long offset, int whence);

En gros je voie pas ce qui t'empeche de jouer avec les valeur de Whence pour ton problem.
Avec whence tu peux te deplacer a partir de ta position actuel donc normalement en y allant a petit pas tu peuix te deplacer ds tout ton fichier quelque soit ca taille.

exemple tu te deplace de 1G a partir dudebut de ton fichier puis apres de 1G a partir te ta position actuel et ainsi de suite.

je sais pas si tu as essaye de faire ca?
youscoul
Messages postés
125
Date d'inscription
dimanche 10 août 2008
Statut
Membre
Dernière intervention
7 janvier 2013
4
Effectivement, ça aurait été simple mais tout le problème est que le fichier est parcourue de manière aleatoire. Par exemple si on trouve categorie =1000 on va à la postion par exmple x et on doit se positionner après le dernier élément stocké pour cette categorie. En resumé, tu peux considerer chaque espace categorie comme un fichier(je veux dire une espace prore à chaque). Par exemple je te fais un schema:
cetgorie1................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
categorie2................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
categorie3.........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
categorieN................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................

Et les categorie se produisent de manière aléatoire. Donc on peut se faire à categorie 3000 pour stocker en premier enregistrement et aleatoirement à categorie 100 pour stocker lors du deuxieme enregistrement. Merci et desolé je sais ke c'est trop brute comme explication mais c'est vraiment un projet costo
Edwyn
Messages postés
105
Date d'inscription
vendredi 20 juin 2008
Statut
Membre
Dernière intervention
31 mars 2011
14
The fseeko() function is identical to fseek(), except it takes an off_t
argument instead of a long. Likewise, the ftello() function is identical
to ftell(), except it returns an off_t.

The fgetpos() and fsetpos() functions are alternate interfaces for
retrieving and setting the current position in the file, similar to
ftell() and fseek(), except that the current position is stored in an
opaque object of type fpos_t pointed to by pos. These functions provide
a portable way to seek to offsets larger than those that can be repre-
sented by a long int. They may also store additional state information
in the fpos_t object to facilitate seeking within files containing multi-
byte characters with state-dependent encodings. Although fpos_t has tra-
ditionally been an integral type, applications cannot assume that it is;
in particular, they must not perform arithmetic on objects of this type.

desole g copier tout le man mais ces fonctions vont te permettre de te deplacer ds ton fichier et surtout de recup les positions dans ton fichier de tes categories
Donc en les stoquant dans des structure (les positions) tu pourrais lier les structure avec leur offset de depart et donc te deplacer a partir du debut de tes categories.

Je sais pas si c'est tres claire mais en gros tu link tes categories a leur offset...
Messages postés
18015
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
17 janvier 2020
4582
hello
il doit y avoir une fonction _fseeki64 ou fseek64 pour accéder des fichiers plus grands que 2 ou 4 Gb
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 79673 internautes nous ont dit merci ce mois-ci

youscoul
Messages postés
125
Date d'inscription
dimanche 10 août 2008
Statut
Membre
Dernière intervention
7 janvier 2013
4
Merci, je l'ai testé. Il fonction mais il bloque tout mon système. Dès qu'il est lancé il s'arrête jamais même si je ferme mon compilateur ou même si j'arrête le processus dans le gestionnaire. Donc est ce vraiment compatible 32 bits sans boguer ? merci au moins je sais ke ça la solution quand je passe ma machine en 64bits.
Messages postés
18015
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
17 janvier 2020
4582
les systèmes 32bits ont en général des fonction d'IO 64 bits pour justement dépasser les limites de taille des fichiers de 4Gb
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 79673 internautes nous ont dit merci ce mois-ci

Messages postés
125
Date d'inscription
dimanche 10 août 2008
Statut
Membre
Dernière intervention
7 janvier 2013
4
Merci, mais ces fonctions ne sont t-elles pas faites pour les systèmes 64 bits ?

Sinon ça serait la solution à mon problème. Encore think
Messages postés
18015
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
17 janvier 2020
4582
non, le but c'est de pouvoir accéder des fichiers de plus de 2/4 Gb, taille petite de nos jours sur des systèms 32 bits, regarde dans la doc (je n'ai pas le C Wndows)