[C] lire une ligne L dans fichier texte

Signaler
Messages postés
254
Date d'inscription
jeudi 29 juillet 2004
Statut
Membre
Dernière intervention
2 avril 2010
-
Messages postés
1
Date d'inscription
samedi 24 octobre 2009
Statut
Membre
Dernière intervention
10 décembre 2009
-
Salut à tous,

Je suis actuellement en galère pour trouver la solution à ce problème : 
   J'aurais besoin de pouvoir lire la ligne dont le numéro serait stocké dans une variable.

Merci d'avance pour votre aide.

Swan94

15 réponses

Messages postés
1403
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
11 janvier 2009
3
Salut !

Pour récupérer la ligne n d'un fichier texte, soit tu utilises n fois la fonction fgets(...) soit tu comptes le nombre de caractère de fin de ligne (caractère '\n') en ayant lu le fichier texte en entier avec la fonction fread(...).
Je précise que la deuxième solution est la plus rapide.

YOYO, @+.
"L'intelligence c'est comme un parachute, quand on en n'a pas...on s'écrase !"
____________________________________________
[Site officiel de YoyoCut, découpe fichiers open source]
Messages postés
254
Date d'inscription
jeudi 29 juillet 2004
Statut
Membre
Dernière intervention
2 avril 2010

salut et merci de m'avoir répondu.

pourrais-tu me mettre un exemple de l'utilisation de fread s'il te plait

merci

Swan94
Messages postés
178
Date d'inscription
mardi 16 août 2005
Statut
Membre
Dernière intervention
25 août 2010
1
voici une possibilité :

int main()
{
    int ma_ligne = 12;
    char buffer[256];

    FILE *f = fopen("c:\\test.txt", "r");
   
    if (f)
    {
        int no_ligne = 0;
        char c;
        while(EOF !(c fgetc(f)))
        {
            if ('\n' == c)
            {
                if (no_ligne == ma_ligne)
                   break;
                no_ligne++;
            }
        }

        if (no_ligne == ma_ligne)
        {
          fgets(buffer, sizeof(buffer), f);
        }
    }

    return getchar();
}
Messages postés
254
Date d'inscription
jeudi 29 juillet 2004
Statut
Membre
Dernière intervention
2 avril 2010

Merci beaucoup pour ton aide mais une dernière chose :
je n'arrive pas à afficher le texte récupéré par fgets. Et une fois que ce sera fait il faudra que je puisse lire la 2 ème chaine de caractère car en fait le fichier se compose ainsi :

test mdptest1
test2 mdptest2

il affiche à l'écran
1) test
2) test2

et il propose à l'utilisateur de choisir entre les differentes possibilités et en fonction du choix il faut que j'arrive à afficher soir mdptest1 soit mdptest2.

Merci beaucoup

Swan94
Messages postés
178
Date d'inscription
mardi 16 août 2005
Statut
Membre
Dernière intervention
25 août 2010
1
""je n'arrive pas à afficher le texte récupéré par fgets"".




????

sinon pour decouper la ligne en deux, tu peux utiliser strok()
Messages postés
254
Date d'inscription
jeudi 29 juillet 2004
Statut
Membre
Dernière intervention
2 avril 2010

d'après toi fgets doit m'afficher mdptest1 si je prend la ligne 1 ?
parce que moi il ne m'affiche rien même en essayant de stocker dans un variable et de faire un printf

Swan94
Messages postés
1403
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
11 janvier 2009
3
Un conseil swan94, quand on te donne des fonctions cherche de la doc dessus (MSDN, google est ton ami).
2 ème conseil, à mon avis tu ferais mieux de chercher des tutoriaux et/ou bouquins de C pour apprendre les bases.
Ce n'est pas en te pondant du code tout fait que tu apprendras quelque chose.

YOYO, @+.
"L'intelligence c'est comme un parachute, quand on en n'a pas...on s'écrase !"
____________________________________________
[Site officiel de YoyoCut, découpe fichiers open source]
Messages postés
254
Date d'inscription
jeudi 29 juillet 2004
Statut
Membre
Dernière intervention
2 avril 2010

j'ai trouvé une solution finalement :
une boucle while avec scanf et je compte les lignes passées dans ma boucle.

Merci quand même à vous pour votre aide.

Swan94
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
Ne pas lire un fichier par petit bout ou 1 char à la fois. Lis tout ton fichier d'un coup et navigue dans le buffer avec des pointeurs:

#include <stdlib.h>
#include
#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[])
{
    char *buffer, *c, *d, tab[256] = {0};
    FILE *file;
    int len, line = 2;

    if(!(file = fopen("c:\\test.txt", "r"))) return 0;

    if(!(len = _lseek(file->_file, 0, SEEK_END))) goto closefile;
    _lseek(file->_file, 0, SEEK_SET);

    if(!(buffer = (char*)malloc(len))) goto closefile;

    fread(buffer, 1, len, file);    c buffer; d buffer;

    do
    {
        if(*c++ == '\n')
        {
            if(!--line) break;
            d = c;
        }
    }while(--len);

    strncpy(tab, d, c-d);

    printf("%s\n", tab);

    free(buffer);
closefile:
    fclose(file);

    system("pause");

    return 0;
}

D'ailleurs, si ton programme ne doit rester que sous Windows, je te suggère d'utiliser les fonctions de l'API Win32:
CreateFile
ReadFile
GetFileSize

C++ (@++)<!--
Messages postés
178
Date d'inscription
mardi 16 août 2005
Statut
Membre
Dernière intervention
25 août 2010
1
"Ne pas lire un fichier par petit bout ou 1 char à la fois. Lis tout ton fichier d'un coup et navigue dans le buffer avec des pointeurs:"




dixit SAKingdom...

Vrai et pas vrai....

SAKingdom., je pense que tu n'a pas du coder beaucoup de projet ou la taille du buffer est importante (serveur web, indexeurs, parser xml, lib de compression, streaming audio / video, etc, ....) et pas codé sur des plateforme à mémoire limitées (windwos ce, palm, ..).

Pour parser un fichier xml de 40 Mo, tu n'alloue pas 40 mo de memoire, tu a un buffer de quelques ko... Ou alors si je devais indexer des fichiers sur des mots clés ou alors analyser des fichiers en multithreads, je ne lispas tout mon fichier mais bout après bout...

Par contre dans l'exemple de Swan, pas de soucis, autant tout faire en mémoire.. Et puis toujours dans sont exemple, au lieu d'aller chercher la Xime ligne qui correspont à un user, autant chargerles fichier 1 fois avec un tableau de user/mdp....

Sur cet exemple de code, tu a entièrement raison... mais en faire un généralité ... c'est de l'héresie !

Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
Je ne généralise pas. Évidament que si un fichier fais 40Mo, on lis par section dans un "petit" buffer mais ce que je voulais dire par "petit bout ou 1 char à la fois", c'est faire des fgetc et fgets pour tout le ficher. Même sur une platforme limité en ressource, c'est impensable surtout si ton programme doit performer.

C++ (@++)<!--
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
J'ai eu beau googler et larousser au possible, point trace de 'performer' sur mon écran.
Pense à le breveter ainsi que performitude.

ciao...
BruNews, MVP VC++
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
Ben t'as mal cherché:
performer -> interprète, artiste (en anglais)

et un artiste ce doit d'être... performant et oui.

C++ (@++)<!--
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
"et un artiste se doit d'être"

pfffff

C++ (@++)<!--
Messages postés
1
Date d'inscription
samedi 24 octobre 2009
Statut
Membre
Dernière intervention
10 décembre 2009

SVP j'ai besoin de vous!!Je suis entrain de travailler sur un projet où je dois extraire des données depuis un fichier pour les utiliser ensuite. Le souci c'est que ces données commencent à partir de la 7éme ligne et que les 7 premières lignes ne sont pas identiques pour chaque fichier. Donc fseek KO :s
J'essaye de lire les 7 premières lignes pour ensuite commencer d'extraire les données mais ça bloque au niveau du while et j'ai une boucle infinie.
Est ce que quelqu'un pourrait m'aider svp????