Rechercher : dans
Par :

[langage C] ftell() fseek()

Dernière réponse le 13 jan 2009 à 22:56:31 bizu53, le 13 jan 2009 à 22:02:07 
 Signaler ce message aux modérateurs

Bonjour,

Jusqu'à maintenant j'utilisais dans mon programme la fonction ftell() pour savoir où se situe la "tête de lecture" dans mon fichier (ouvert en lecture) lorsque je ferme mon programme ; sa valeur était enregistrée dans un petit fichier supplémentaire. Lorsque je le réexécutais (avec les arguments qu'il faut), le petit fichier supplémentaire était lu, le fichier rouvert en lecture, et avec un fseek(fpRead, offset, SEEK_SET); je le replaçais là où il en était juste avant la fermeture du programme.

Mon problème, c'est que ça fonctionne très bien pour des fichiers de "petite" taille. Mais je dispose de fichier pesant plusieurs Go (environ 30Go). Ce qui est trop grand pour ftell() lorsque la "tête de lecture" est bien avancée (je n'ai pas testé mais je pense que la limite doit être 2^31o = 2Go). Du coup je ne peux pas repositionner là où il faut lors de la reprise.

J'ai pensé à faire une boucle while avec un compteur et faisant un fseek(fpRead, -10000, SEEK_CUR); pour reculer de 10000octet jusqu'à trouver le début ; j'en obtiendrais ainsi la position de la "tête de lecture" non pas directement au ftell() mais A×10000+B (avec A le compteur de la boucle while incrémenté à chaque pas de 10'000octets).
Je ne trouve pas ça très joli, je ne l'ai que pensé, pas encore fait.

Est-ce que quelqu'un connaîtrait une autre méthode "plus jolie" pour récupérer la position de la "tête de lecture" dans un fichier énorme ?

Merci par avance

Configuration: Windows XP
Firefox 3.1

Meilleures réponses pour « [langage C] ftell() fseek() » dans :
Langage C++ - Les types de données Voir Les types de données Les données manipulées en langage C++, comme en langage C, sont typées, c'est-à-dire que pour chaque donnée que l'on utilise (dans les variables par exemple) il faut préciser le type de donnée, ce qui permet de connaître...
Langage C - Les types de données Voir Les types de données Les données manipulées en langage C sont typées, c'est-à-dire que pour chaque donnée que l'on utilise (dans les variables par exemple) il faut préciser le type de donnée, ce qui permet de connaître l'occupation mémoire (le...
Langage C - Les chaînes de caractères Voir Qu'est-ce qu'une chaîne de caractères ? Une chaîne de caractères (appelée string en anglais) est une suite de caractères, c'est-à-dire un ensemble de symboles faisant partie du jeu de caractères, défini par le code ASCII. En langage C, une chaîne...
[Langage C] C/C++ Erreur de segmentation VoirQu'est ce qu'une erreur de segmentation Vous êtes en train de développer une application sous Linux en C/C++. Tout va bien, ça compile, les oiseaux chantent. Donc vous lancez votre application pour la tester. Et vous obtenez l'un de ces deux...
Les piles en langage C VoirLes piles Requis I. INTRODUCTION II. Définition III. La construction du prototype d'un élément de la pile IV. Opérations sur les piles A. Initialisation B. Insertion d'un élément dans la pile C. Ôter un élément de la pile D. Affichage...
Les files en langage C VoirLes files - Premier Entré Premier Sorti Requis I. INTRODUCTION II. Définition III. La construction du prototype d'un élément de la file IV. Opérations sur les files A. Initialisation B. Insertion d'un élément dans la file C. Oter un...
Langage C - Les variables VoirLe concept de variable Une variable est un objet repéré par son nom, pouvant contenir des données, qui pourront être modifiées lors de l'exécution du programme. Les variables en langage C sont typées, c'est-à-dire que les données contenues dans...
Les classes en langage C++ VoirLa notion d'objet Le langage C est un langage procédural, c'est-à-dire que c'est un langage permettant de définir des données grâce à des variables, et des traitements grâce aux fonctions. L'apport principal du langage C++ par rapport au...

1

fiddy, le 13 jan 2009 à 22:51:30

Salut,
Tu peux déjà commencer par utiliser fgetpos et fsetpos qui te permettront d'utiliser des nombres beaucoup plus grand (long long). Après, si cette taille n'est toujours pas assez grande, il n'existe pas de fonctions standards.
Sinon, après, tu peux faire comme tu as commencé.
Tu peux te définir une structure :

typedef struct {
    unsigned int facteur;
    unsigned int offset;
} FileNb;

facteur sera le nombre d'itérations de ta boucle while avec des pas de INT_MAX et offset l'ajustement.

J'espère t'avoir aidé.
Cdlt Google is your friend

Répondre à fiddy

2

 bizu53, le 13 jan 2009 à 22:56:31

Ok merci bien. Je vais voir ça :).

Comme je ne pense pas que je serai confronté à un autre problème concernant ça je mets mon sujet comme résolu.

Répondre à bizu53