[C] lire une ligne L dans fichier texte

swan94 Messages postés 254 Date d'inscription jeudi 29 juillet 2004 Statut Membre Dernière intervention 2 avril 2010 - 25 févr. 2007 à 15:32
shurikan Messages postés 1 Date d'inscription samedi 24 octobre 2009 Statut Membre Dernière intervention 10 décembre 2009 - 10 déc. 2009 à 16:13
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

yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 2
25 févr. 2007 à 15:40
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]
0
swan94 Messages postés 254 Date d'inscription jeudi 29 juillet 2004 Statut Membre Dernière intervention 2 avril 2010
25 févr. 2007 à 15:53
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
0
cs_vicenzo Messages postés 178 Date d'inscription mardi 16 août 2005 Statut Membre Dernière intervention 25 août 2010 1
25 févr. 2007 à 16:12
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();
}
0
swan94 Messages postés 254 Date d'inscription jeudi 29 juillet 2004 Statut Membre Dernière intervention 2 avril 2010
25 févr. 2007 à 16:32
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_vicenzo Messages postés 178 Date d'inscription mardi 16 août 2005 Statut Membre Dernière intervention 25 août 2010 1
25 févr. 2007 à 16:44
""je n'arrive pas à afficher le texte récupéré par fgets"".




????

sinon pour decouper la ligne en deux, tu peux utiliser strok()
0
swan94 Messages postés 254 Date d'inscription jeudi 29 juillet 2004 Statut Membre Dernière intervention 2 avril 2010
25 févr. 2007 à 16:48
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
0
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 2
25 févr. 2007 à 16:52
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]
0
swan94 Messages postés 254 Date d'inscription jeudi 29 juillet 2004 Statut Membre Dernière intervention 2 avril 2010
25 févr. 2007 à 17:13
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
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
25 févr. 2007 à 17:23
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++ (@++)<!--
0
cs_vicenzo Messages postés 178 Date d'inscription mardi 16 août 2005 Statut Membre Dernière intervention 25 août 2010 1
25 févr. 2007 à 17:44
"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 !

0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
25 févr. 2007 à 17:50
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++ (@++)<!--
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
26 févr. 2007 à 00:39
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++
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
26 févr. 2007 à 02:15
Ben t'as mal cherché:
performer -> interprète, artiste (en anglais)

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

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

pfffff

C++ (@++)<!--
0
shurikan Messages postés 1 Date d'inscription samedi 24 octobre 2009 Statut Membre Dernière intervention 10 décembre 2009
10 déc. 2009 à 16:13
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????
0
Rejoignez-nous