IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

problème de curseur avec fgets


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2022
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2022
    Messages : 2
    Par défaut problème de curseur avec fgets
    Bonjour,
    J'ai un petit projet de gestion de bibliothèque en C que je suis en train de réaliser, et je ne trouve pas d'aide sur les forums pour ça. J'ai un fichier texte dont chaque ligne représente des données d'un livre en bibliothèque, et j'aimerais parcourir chaque ligne jusqu'à trouver le livre qui m'intéresse, et modifier le dernière caractère de la ligne (0 ou 1, selon si le livre est dispo ou non). Je pensais donc utiliser fgets sur chaque ligne, analyser si c'est le livre qui m'intéresse, et une fois trouvé, mettre le curseur en retrait d'un ou deux crans pour changer le caractère. Mais ça ne marchait pas. J'ai alors créer le fichier "test.txt" suivant :
    123
    456
    789
    aze
    rty
    uiop
    qsdf

    et cherché où était le curseur après un fgets avec ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    int main(){
    	FILE *f=fopen("test.txt", "r+");
    	int i;
    	for(i=0;i<6;i++)
    		printf("%c", fgetc(f));
    	int size =100;
    	char inter[size];
    	fgets(inter, size, f);
    	printf("\ninter : %s", inter);
    	fclose(f);
    }
    En sortie j'obtiens :
    123
    45
    azeer : 6

    Et là je sèche ! Je comprends les deux premières lignes. Ensuite pour moi la 3è devrait être "inter : 6" et placer le curseur au début de la ligne suivante (789), mais visiblement, il ne m'affiche pas cette ligne-là, et m'affiche la suivante par-dessus le premier affichage ! Est-ce que quelqu'un peut m'expliquer pourquoi ? Merci beaucoup !

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Bonjour,

    Un fichier texte contient des caractères visibles mais aussi des caractères spéciaux appelés caractères de contrôle. Ce que tu vois est le résultat de ces caractères de contrôle.
    Ton printf() dit : passer à la ligne puis écrire "inter : " puis écrire ce qui a été lu dans le fichier. Et ce qui a été lu est : "6" puis retour à la ligne puis "aze" puis passer à la ligne puis retour à la ligne.
    C'est ce qu'il se passe. A droite de "inter : " un '6' est ajouté, puis retour à la ligne qui va écrire "aze" par dessus "inter : 6". Ça donne donc bien "azeer : 6".

    On peut lire un fichier en mode texte ou en mode binaire. Le premier cas est adapté aux fichiers contenant du texte, on peut lire ou écrire des textes, mais la modification directe est quasi impossible à cause des caractères de contrôle. Dans ce mode seul fgets() et sscanf() sont viables pour lire. En mode binaire, c'est moins adapté aux textes mais là on a un accès direct aux octets du fichiers, et on utilise alors les fonctions fgetc() et fread() pour lire et surtout pas fgets() et sscanf(). Et en mode binaire on peut faire des modifications directe du fichier.

  3. #3
    Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2022
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2022
    Messages : 2
    Par défaut
    D'accord, merci pour la réponse, ça me parait bien compliqué ! J'ai réeffacé et réécrit mon fichier texte, et ça marche très bien à présent...j'ai sûrement effacé ces caractères de contrôle...Dans mon exemple, j'ai juste lu, même pas encore modifié de caractères...je vais me pencher sur le binaire alors, même si ça ma l'air compliqué juste pour changer un octet

Discussions similaires

  1. Problème de curseur avec champ déscativé/activé
    Par picatchou dans le forum Access
    Réponses: 2
    Dernier message: 07/09/2006, 17h32
  2. problème avec fgets
    Par salseropom dans le forum C
    Réponses: 1
    Dernier message: 03/08/2006, 14h54
  3. Problème d'accent avec fgets
    Par d.w.d dans le forum Langage
    Réponses: 2
    Dernier message: 31/03/2006, 07h37
  4. PL/SQL, problème dans un curseur avec un insert
    Par yador dans le forum PL/SQL
    Réponses: 4
    Dernier message: 27/01/2006, 14h31
  5. Problème avec fgets et tube...
    Par tchingoo dans le forum POSIX
    Réponses: 5
    Dernier message: 22/08/2003, 17h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo