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 :

Position dans un fichier


Sujet :

C

  1. #1
    Membre à l'essai
    Étudiant
    Inscrit en
    Juin 2007
    Messages
    32
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2007
    Messages : 32
    Points : 12
    Points
    12
    Par défaut Position dans un fichier
    Bonjour, j'ai fait des recherches sur internet, une petite recherche ici, mais je n'ais pas trouvé ce que je voudrais.
    En faite, les fonctions C de "position" dans un fichier, permette de se mettre par exemple a 2 caractères du début. Mais moi j'aimerais me poser sur une en faite.
    Comment se positionner sur une ligne (par exemple la ligne 3 de mon fichier) ?



    ps: le fichier est de la forme : code nom prénom solde

    j'ai testé un truc de ce style:
    on cherche la position que l'on veut
    on fait un sscanf jusqu'a ce qu'on l'ai fait autant de fois que la ligne voulue
    et on écrit le texte a cet endroit


    je pensais que si on faisait un sscanf, le curseur de position dans le fichier se déplacait en meme temps, mais apparement non

  2. #2
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut Re:
    Cette question n'a des sens que si le fichier est de type texte. Pour cela il suffit juste de se placer en début du fichier puis de lire la ligne courante tant qu'on n'est pas à la bonne. Et y a pas 36 solutions.

  3. #3
    Membre à l'essai
    Étudiant
    Inscrit en
    Juin 2007
    Messages
    32
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2007
    Messages : 32
    Points : 12
    Points
    12
    Par défaut
    euh j'ai édité en meme temps que tu as répondu, j'avais essayé de faire ca, peut etre que je m'y suis mal prit. Regarde la fin de mon message ci dessus s'il te plait, j'ai expliqué la démarche que j'ai faite

  4. #4
    Membre habitué Avatar de Ksempac
    Inscrit en
    Février 2007
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 165
    Points : 185
    Points
    185
    Par défaut
    Pas de solution automatique : il te faut reperer la position du 3eme \n en lisant depuis le début, et te positionner un caractère après.

    Si tu as beaucoup de lignes, qu'elles sont relativement semblables et que tu souhaites fréquemment faire appel a une ligne spécifique (mini BDD par exemple) il y a une autre solution. Elle consiste a avoir des lignes de taille fixe (en completant les lignes avec un caractère de remplissage). Ainsi tu atteints la n-ieme ligne en allant chercher le ((n-1)*taille de la ligne+1)eme caractere

  5. #5
    Membre à l'essai
    Étudiant
    Inscrit en
    Juin 2007
    Messages
    32
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2007
    Messages : 32
    Points : 12
    Points
    12
    Par défaut
    merci, je vais tester ca, je vous tient au courant

  6. #6
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Mais non! On lit une ligne avec fgets() pas avec fscanf()! Si tu veux aller à la ligne trois fais fgets() 2 fois et c'est bon!

    Citation Envoyé par Ksempac
    il te faut reperer la position du 3eme \n en lisant depuis le début, et te positionner un caractère après.
    Qu'est-ce que tu racontes la?

  7. #7
    Membre expérimenté
    Avatar de muad'dib
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2003
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 011
    Points : 1 375
    Points
    1 375
    Par défaut
    fgets() te permet de lire une ligne dans un fichier jusqu'au caractère \n. Donc, après 2 fgets, tu seras positionné sur la 3è ligne.

  8. #8
    Membre à l'essai
    Étudiant
    Inscrit en
    Juin 2007
    Messages
    32
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2007
    Messages : 32
    Points : 12
    Points
    12
    Par défaut
    euh je vais essayer la nouvelle solution ^^ car avec l'autre il m'écrit n'importe quoi, exemple, je selectionne la 6eme ligne, et au lieu de ca, il m'écrit "BONJ" (c'était pour tester) à la 6eme place de ma 2eme ligne ^^

    je test avec fget de suite

  9. #9
    Membre à l'essai
    Étudiant
    Inscrit en
    Juin 2007
    Messages
    32
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2007
    Messages : 32
    Points : 12
    Points
    12
    Par défaut
    erf la il ne m'écrit meme plus mon "BONJ" pourtant il est cencé le faire, donc j'ai fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    int j = i;
    char ligne[200];
    while (j !=0){
         fgets(ligne,200,f);
          j--;
    }
    i étant la ligne que je désire atteindre
    f étant mon fichier
    ensuite j'ai fait
    et il ne me l'affiche pas dans mon fichier

  10. #10
    Membre éprouvé
    Avatar de Freed0
    Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    635
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 635
    Points : 953
    Points
    953
    Par défaut
    Code incomplet, l'erreur peut venir de n'importe où... Tu fermes bien ton fichier à la fin ?

  11. #11
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Bon, c'est pas très chic le compte à rebour donc je corrige un peu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for(nb_lignes_lues = 0; nb_lignes_lues < num_ligne_a_atteindre; nb_lignes_lues++)
        fgets(buffer, sizeof(buffer), p_file);
     
    printf("%s", buffer);
    Si tu veux ajouter des données dans ton fichier assure toi que le fichier est bien ouvert en mode "a" ou "a+" ...

    ---- EDIT ---- : En supposant que buffer est assez grand pour contenir n'importe quelle ligne du fichier ...

  12. #12
    Membre éprouvé
    Avatar de Freed0
    Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    635
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 635
    Points : 953
    Points
    953
    Par défaut
    Moi perso je garderai la structure avec le while :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int ligne_voulue = 3;
    /* Si on ne souhaite pas avoir la ligne dans le buffer, on se place juste à son début 
    ligne_voulue--;
    */
    int i = ligne_voulue;
     
    while (i > 0 && (fgets (buffer, sizeof buffer, fd) != NULL))
        i--;
     
    printf ("%s", buffer);

  13. #13
    Membre à l'essai
    Étudiant
    Inscrit en
    Juin 2007
    Messages
    32
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2007
    Messages : 32
    Points : 12
    Points
    12
    Par défaut
    euh je vais "élargir" le code que j'ai fourni ^^ j'en met un peu plus
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    //**********************************************************************************************/
    //                                                                                             //
    //           E C R I T U R E   D A N S    L A    B A S E   D E   D O N N E E S                 //
    //                                                                                             //
    //**********************************************************************************************/
    gboolean Valider(GtkWidget *widget, GdkEventButton *event, gpointer user_data)
    {      //Ecriture fichier
           FILE *f = fopen("test.txt", "r+");
           if(f)
           {
          /* Convertion et calcul du nouveau solde */
                  char stTemp[10];
                  int result, result1, result2;
                  sprintf(stTemp,"%s",gtk_entry_get_text(GTK_ENTRY(tableau[0].ZoneSoldeM)));
                  result = atoi(stTemp);
                  sprintf(stTemp,"%s",gtk_entry_get_text(GTK_ENTRY(tableau[0].ZoneNbReloadM)));
                  result1 = atoi(stTemp);
                  sprintf(stTemp,"%s",gtk_entry_get_text(GTK_ENTRY(tableau[0].ZoneNbRepM)));
                  result2 = atoi(stTemp);
                  int solde = 0 ;
                  solde = result + result1 - result2;
                  char chaine[20];
                  sprintf(chaine, "%d", solde);
                  gtk_entry_set_text(GTK_ENTRY(tableau[0].ZoneSoldeM),chaine);
          /* Modification dans fichier */
                  int i, nombrelement = LectureFichier("test.txt", element);
                  fseek(f, 0, SEEK_SET);
                  for(i = 0; i < nombrelement; i++){
                         if(strcmp(gtk_combo_box_get_active_text(GTK_COMBO_BOX(tableau[0].ZoneNomM)),element[i].nom)==0){
                                       printf("element Nom : %s \n",element[i].nom);
                                       printf("placement du curseur : %d\n",i);
                                       int j = i;
                                       char ligne[200];
                                       while (j !=0){
                                              fgets(ligne,200,f);
                                              j--;
                                       }
                          }
                  }
                  fputs("BONJ",f);
                  printf("Ecriture terminée\n");
                  fclose(f);
           }
           return FALSE;
    }
    ps: les lignes dans le fichier sont de ce style
    4819 LACOURTABLAISE Marie-Sophie 0
    donc je pense que a moin d'avoir un nom prénom super super long ^^ 200 caractere pour le buffer ca doit etre assez
    et euh comme tu le vois, j'ai ouvert mon fichier en r+ j'ai cru lire que ca servait a lire et écrire dedans.
    j'ai compris ton bout de code pour le "compte a rebour" mais le printf ca écrit dans la console non? pas dans le fichier donc je met mon fputs apres le for je pense, je vais essayer ca

  14. #14
    Membre à l'essai
    Étudiant
    Inscrit en
    Juin 2007
    Messages
    32
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2007
    Messages : 32
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par Freed0
    Moi perso je garderai la structure avec le while :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int ligne_voulue = 3;
    /* Si on ne souhaite pas avoir la ligne dans le buffer, on se place juste à son début 
    ligne_voulue--;
    */
    int i = ligne_voulue;
     
    while (i > 0 && (fgets (buffer, sizeof buffer, fd) != NULL))
        i--;
     
    printf ("%s", buffer);
    je viens de tester ca, et il ne veut toujours pas me mettre mon BONJ dans mon fichier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    int i, nombrelement = LectureFichier("test.txt", element);
                  fseek(f, 0, SEEK_SET);
                  for(i = 0; i < nombrelement; i++){
                         if(strcmp(gtk_combo_box_get_active_text(GTK_COMBO_BOX(tableau[0].ZoneNomM)),element[i].nom)==0){
                                       printf("element Nom : %s \n",element[i].nom);
                                       printf("placement du curseur : %d\n",i);
                                       int j = i;
                                       char ligne[200];
                                       int ligne_voulue = 3;
                                       int u = ligne_voulue;
                                       while (u > 0 && (fgets (ligne, sizeof ligne, f) != NULL)){
                                              u--;
                                       }
                         }
                  }
                  fputs("BONJ",f);
    ps: j'ai remi qu'un bout du code

  15. #15
    Membre à l'essai
    Étudiant
    Inscrit en
    Juin 2007
    Messages
    32
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2007
    Messages : 32
    Points : 12
    Points
    12
    Par défaut
    ca marche!!!!!!!!!!!!!! il manquait un petit truc, je l'ais rajouté pour tester et ca a fonctionner
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    fseek(f, 0, SEEK_CUR);
    juste apres le while, je remet un bout de code pour ceux que ca interesserait et qui aurait mon problème
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    int i, nombrelement = LectureFichier("test.txt", element);
                  fseek(f, 0, SEEK_SET);
                  for(i = 0; i < nombrelement; i++){
                         if(strcmp(gtk_combo_box_get_active_text(GTK_COMBO_BOX(tableau[0].ZoneNomM)),element[i].nom)==0){
                                       printf("element Nom : %s \n",element[i].nom);
                                       printf("placement du curseur : %d\n",i);
                                       char ligne[200];
                                       int u = i;
                                       while (u > 0 && (fgets (ligne, sizeof ligne, f) != NULL)){
                                              u--;
                                       }
                                       fseek(f, 0, SEEK_CUR);
                         }
                  }
                  fputs("BONJ",f);

  16. #16
    Membre à l'essai
    Étudiant
    Inscrit en
    Juin 2007
    Messages
    32
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2007
    Messages : 32
    Points : 12
    Points
    12
    Par défaut
    Merci à tous pour les pistes et de m'avoir aidé je met résolu

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Remplacer position dans un fichier
    Par menakikou dans le forum Linux
    Réponses: 12
    Dernier message: 28/03/2012, 10h18
  2. [SAX] Position dans le fichier
    Par snyouf dans le forum Format d'échange (XML, JSON...)
    Réponses: 0
    Dernier message: 11/09/2008, 15h05
  3. aller à une position précise dans un fichier texte
    Par bassidi meryeme dans le forum Langage
    Réponses: 3
    Dernier message: 27/10/2005, 14h57
  4. Réponses: 5
    Dernier message: 20/02/2005, 01h14
  5. [Win32] Position dans un fichier
    Par vecchio dans le forum Windows
    Réponses: 7
    Dernier message: 22/03/2004, 16h47

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