Rechercher : dans
Par :
 Signaler ce message aux modérateurs

Bonjour,
Est ce que quelqu'un peut m'expliquer comment fonctione fseek en C car j'ai fait un projet où je dois faire un carnet d'adresse et j'aimerai afficher à l'écran que certaines informations. Comment faire???

Configuration: Windows XP
Internet Explorer 7.0

Meilleures réponses pour « Fseek c » dans :
La compilation et les modules en C et en C++ VoirCet article a pour vocation d'introduire les notions de bases de la compilation en C et en C++ et de la programmation modulaire. Il permet de mieux comprendre les messages d'erreur du compilateur. Les notions abordées ici sont indépendantes du...
3D Secure / Verified by Visa / SecureCode: Qu'est-ce que c'est ? VoirDepuis octobre 2008, les banques et commerçants en ligne ont commencé à adopter le système 3DSecure pour les paiements sur Internet. Qu'est-ce que c'est ? 3DSecure est appelé "Verified by Visa" chez Visa, et "SecureCode" chez Mastercard. (Les logos...
[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...
Télécharger Visual C++ Express VoirVisual C++ Express est une version "gratuite" et allégée de Visual Studio ; l'utilisation requiert l'inscription sur le site de Microsoft. Cet environnement de développement permet de créer des application Win32 ou du .NET C.
Langage C++ - Les types de données VoirLes 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...
Les chaînes de caractères en C++ VoirQu'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...
Langage C - Les types de données VoirLes 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...

1

cijad, le 4 mar 2008 à 20:48:34
  • +3

Salut,

fseek s'utilise de la manière suivante :

fseek(pf,deplacement,reference)

Elle te permet de placer le curseur à une position donnée pour réaliser un accès direct dans un fichier. Les paramètres sont :
  FILE *pf; // le pointeur vers le fichier en question
  long deplacement; // le déplacement à réaliser
  int reference; //point de référence pour le déplacement

la nouvelle position sera decalée d'un nombre d'octets égal au paramètre deplacement depuis :

-le début du fichier si reference vaut SEEK_SET (valant en fait 0)
-la position courante si reference vaut SEEK_CUR (valant en fait 1)
-la fin du fichier si reference vaut SEEK_END (valant en fait 2)

Pour finir, il faut bien sur inclure la bibliothèque stdio.h

voilà je crois que j'ai tout dis

Répondre à cijad

2

didy_gwatinik, le 4 mar 2008 à 21:01:47

Ok, mais tu peux m'expliquer un peu plus seek_set, seek_cur et seek_end en fait je ne comprens pas trop leurs valeurs

Répondre à didy_gwatinik

3

cijad, le 4 mar 2008 à 21:57:26

Eh bien, il faut que tu considères qu'il y a un curseur qui parcourt ton fichier d'octet en octet. Chaque fois que tu utilises un octet de ce fichier le curseur se déplace d'une case. A la prochaine utilisation il prendra l'octet qui est actuellement pointé par le curseur, puis le décalera et ainsi de suite.
Imaginons que tu ais déjà utilisé ton fichier, par exemple tu l'as parcourus et tu a reconnu un certain mot, si tu veux sauter les x octets suivants, tu devra écrire :

fseek(pfichier,x,SEEK_CUR);
il va déplacer le curseur de x octets depuis ta position actuelle. Donc SEEK_CUR te donnera un déplacement relatif à ta position actuelle.

Si par contre ce qui t'intéresse c'est d'aller te placer à un endroit dont tu connais la position x en octet par rapport au début du fichier, tu devra saisir :
fseek(pfichier,x,SEEK_SET);
il va automatiquement repartir au début du fichier et déplacer le curseur de x octets jusqu'à la position voulue.

Meme chose si tu connais la position de ton octet par rapport à la fin, mais tu remplace par SEEK_END.


Si c'était ta question SEEK_SET, SEEK_CUR et SEEK_END sont déjà prédéfinis dans la bibliothèque stdio.h (au moyen d'un #define). Ils valent respectivement 0, 1 et 2 mais il vaut mieux mettre les valeurs en texte car c'est plus explicite. Par contre cela implique bien sur que tu dois respecter les mettre en majuscule.

dis moi si tu as mieux compris cette fois ^^

PS : Bien sur ton déplacement peut être négatif (il vaut mieux pour le seek_end).

Répondre à cijad

4

didy_gwatinik, le 5 mar 2008 à 20:13:38

Ah oui c'est beaucoup plus clair comme ça
Mais j'ai une dernière question :s Comment faire pour savoir de combien d'octets on doit se déplacer?!

Répondre à didy_gwatinik

5

cijad, le 5 mar 2008 à 22:59:27
  • +1

Oui en effet c'est une bonne question. Je dirais que ça dépend de ce que tu veux faire. Je vois à peu près deux cas possibles :

- soit tu connais la position que tu veux atteindre (par rapport au début du fichier par exemple), (dans ce cas tu utilisera SEEK_SET). Comment est- ce que tu peux connaître cette position ? eh bien, le plus simple, tu as enregistré que des caractères sur ton fichier, tu sais que un caractère prend un octet, donc pour te placer sur le cinquième caractère tu fais fseek(pfichier,5,SEEK_SET); petit rappel des tailles de chaque type :

char c; // 1 octet
short a; //2 octets
unsigned int b; //2 octets
int d; // 4 octets
long e; // 4 octets
unsigned long f; // 4 octets
float g; // 4 octets
double h; // 8 octets
long double i; // 10 octets

Sinon ce qui peux se passer aussi ( et ça peut être utile ) c'est que tu peux utiliser la fonction ftell qui rend la position actuelle
FILE* pfichier;
ftell(pfichier);
par exemple, tu est arrivé à un endroit et tu veux recopier la valeur à la fin du fichier et revenir ensuite à cet endroit :
long position;
fread(adresse,taille,nombre,pfichier);//lit un certain nombre d'éléments
position=ftell(pfichier);//retiens la position a la suite de ces éléments
fseek(pfichier,0,SEEK_END);//va a la fin 
fwrite(adresse,taille,nombre,pfichier);//ecrit les éléments
fseek(pfichier,position,SEEK_SET);//retourne a la position initiale


- le deuxième cas c'est si tu veux sauter un certain nombre d'octets apres la position actuelle. Par exemple, tu as fait une structure POINT_t est tu veux aller trois points plus loin
fseek(3*sizeof(POINT_t));
//sizeof(type) te donne la taille d'un certain type
//... c'est tres util pour les structures


voilà je crois que tu as tous les outils pour partir à l'exploration de tes fichiers.

Répondre à cijad

6

didy_gwatinik, le 6 mar 2008 à 19:05:03

Ah ok!
Et bien merci beaucoup pour toutes ces informations très précises et très claires!

Répondre à didy_gwatinik

7

cijad, le 6 mar 2008 à 19:45:31

Oh mais de rien, ça me fait plaisir. N'hésite pas au besoin

Répondre à cijad

8

didy_gwatinik, le 18 mar 2008 à 16:11:47

Je galere un peu voila imaginons que dans mon fichier j'ai ceci :
Nom
Prenom
adresseMail
Telephone
Nom2
Prenom2
adresseMail2
Telephone2
Comment je pourais faire pour afficher nom et nom2?
Comment connaitre la taille d'une chaine de caractere?

Répondre à didy_gwatinik

9

cijad, le 18 mar 2008 à 21:07:57

Alors je vois plusieurs solutions. Comme tu l'as souligné, je dirais que le problème c'est de connaitre la taille, comme toujours pour les chaines ^^.

Une première chose, normalement quand tu as écris dans ton fichier tu as du fixer la taille maximale des chaines de caractères (quelque chose du genre #define TAILLE_MAX 50). Dans ce cas tu n'as pas trop de soucis. Tu n'as cas déclarer un chaine de caractère de longueur TAILLE_MAX, puis lire les caractères du nom un a un jusqu'à tomber sur un retour chariot. Tu sera sure que le mot peut pas dépasser, donc normalement c'est bon.

Je vois une autre solution. Tu déclares ta chaîne comme un pointeur vers des caractères (pas besoin de donner la taille dès le début) ensuite tu lis une première fois ton mot pour compter le nombre de lettres, tu alloue de la mémoire pour ton pointeur maintenant que tu sais combien de lettres il te faut, enfin tu retourne au début de ton mot et tu le lit une nouvelle fois pour compléter ton pointeur.

Une manière plus élégante de faire ça c'est une fonction récursive (si tu vois ce que c'est). Chaque fonction élémentaire lira un caractère et appelera la suivante jusqu'a ce qu'une d'entre elle tombe sur un retour chariot, tu auras donc la taille et tu pourra remplir ton mot sur le retour. Au final, ça t'évite les allé et retour dans ton fichier. (ça doit etre avantageux en temps dans ton cas, je vais me renseigner)

comme d'hab', si tu veux plus de précisions, n'hésite pas

PS: je voudrais bien voir ton code qd tu aura fini, ça a l'air sympa ton programme.

Répondre à cijad

10

débutant_fr, le 13 jun 2008 à 01:40:25

Salut didy_gwatinik, stp si tu peux me balancer ton code j'ai besoin d'un programme semblable.
Merci d'avance;

Répondre à débutant_fr

11

didy_gwatinik, le 13 jun 2008 à 14:31:14

De quoi comme programme? Recherche dans un fichier?

Répondre à didy_gwatinik

12

 débutant_fr, le 14 jun 2008 à 02:24:54

Salut,
en fait je travaille sur un fichier texte auquel je voudrais, en le parcourant et le lisant ligne par ligne ignorer certaines lignes.. Je connais pas quelle fonction utiliser. Je sais que la fonction ignore existe mais c'est avec les stream ce qui n'est pas mon cas. Alors j'ai pensé que fseek me serait utile. c'est pourquoi j'ai demandé ton code..

Répondre à débutant_fr
Collection CommentÇaMarche.net