[C] Déplacer dans un fichier de 50Go ?

Résolu/Fermé
youscoul Messages postés 125 Date d'inscription dimanche 10 août 2008 Statut Membre Dernière intervention 7 janvier 2013 - 21 avril 2010 à 09:45
dubcek Messages postés 18755 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 14 novembre 2024 - 21 avril 2010 à 11:56
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.

A voir également:

5 réponses

Edwyn Messages postés 105 Date d'inscription vendredi 20 juin 2008 Statut Membre Dernière intervention 31 mars 2011 14
21 avril 2010 à 09:56
Salut,

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

j'espere que ca t'aidera


bye
1
youscoul Messages postés 125 Date d'inscription dimanche 10 août 2008 Statut Membre Dernière intervention 7 janvier 2013 4
21 avril 2010 à 10:22
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.
0
Edwyn Messages postés 105 Date d'inscription vendredi 20 juin 2008 Statut Membre Dernière intervention 31 mars 2011 14
21 avril 2010 à 10:39
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?
0
youscoul Messages postés 125 Date d'inscription dimanche 10 août 2008 Statut Membre Dernière intervention 7 janvier 2013 4
21 avril 2010 à 10:51
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
0
Edwyn Messages postés 105 Date d'inscription vendredi 20 juin 2008 Statut Membre Dernière intervention 31 mars 2011 14
Modifié par Edwyn le 21/04/2010 à 11:38
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...
0
dubcek Messages postés 18755 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 14 novembre 2024 5 621
21 avril 2010 à 09:58
hello
il doit y avoir une fonction _fseeki64 ou fseek64 pour accéder des fichiers plus grands que 2 ou 4 Gb
1
youscoul Messages postés 125 Date d'inscription dimanche 10 août 2008 Statut Membre Dernière intervention 7 janvier 2013 4
21 avril 2010 à 10:55
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.
0
dubcek Messages postés 18755 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 14 novembre 2024 5 621
21 avril 2010 à 10:45
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
youscoul Messages postés 125 Date d'inscription dimanche 10 août 2008 Statut Membre Dernière intervention 7 janvier 2013 4
21 avril 2010 à 10:24
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
0

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

Posez votre question
dubcek Messages postés 18755 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 14 novembre 2024 5 621
21 avril 2010 à 11:56
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)
0