Accueil > Forum > > > > lire un fichier ligne par ligne
lire un fichier ligne par ligne
vendredi 23 mai 2008 à 21:21:12 |
lire un fichier ligne par ligne

jOlcoWboY
|
Bien le bonjour, je me suis fait un 'tit bou de code afin de lire un fichier texte ligne par ligne. Je voulais juste savoir si il avait des améliorations encore a faire ou pas (notamment a cause des tests de caracteres ... en tout cas il marche chez moi^^) (ps: je l'utilise pour bannir des ip dans un serveur...enfin bref) D'avance merci et bonne prog' FILE* f=fopen("blacklist.cfg","rt"); if(f){ char c; char* s; unsigned int n; do{ s=NULL; n=0; do{ c=gets(f); if (c!='\0' && c!='\n' && c!='\t' && c!=EOF){ s=(char*)realloc(s,n+1); if(s) s[n++]=c; } }while ( c!='\0' && c!='\n' && c!='\t' && c!=EOF ); s=(char*)realloc(s,n+1); if (s) s[n++]='\0'; /*** ici "s" a correspond a la ligne ***/ free(s); }while(c:=EOF); //on fait ca pour toutes les lignes du fichier fclose(f); } -= j l'coWboY =-
|
|
vendredi 23 mai 2008 à 22:20:30 |
Re : lire un fichier ligne par ligne

SAKingdom
|
Je ne vois pas comment ça pourrait fonctionner voir même compiler. c=gets(f);
gets prend, en paramètre, un pointeur char (char*) et non un FILE*. De plus, cette fonction retourne un char * (le même que celui passé en argument sinon, si fin de fichier atteint, un pointeur nul) et non un char. Finalement, cette fonction sert à lire dans la console (stdin), pas dans un fichier.
while(c:=EOF); ??? := ???
C++ (@++)
|
|
vendredi 23 mai 2008 à 22:21:12 |
Re : lire un fichier ligne par ligne

NairodDorian
|
Bonsoir,
Tu fais beaucoup de realloc ce qui n'est pas négligeable pour le temps d'exécution. "je l'utilise pour bannir des ip dans un serveur"
Les adresses ip ont la forme : xxx.xxx.xxx.xxx
donc s[4 * 4 + 1] ce qui évite les realloc Partant de là tu peux optimisé ton code.
|
|
vendredi 23 mai 2008 à 22:28:07 |
Re : lire un fichier ligne par ligne

SAKingdom
|
" (le même que celui passé en argument sinon, si fin de fichier atteint, un pointeur nul)"
Oops. Ce n'est pas la "si fin de fichier atteint" mais plutôt "si fin de flux (stdin) atteint".
C++ (@++)
|
|
vendredi 23 mai 2008 à 22:37:02 |
Re : lire un fichier ligne par ligne

Neo_Fr
|
Un exemple avec ReadLine a dl ici:
http://www.cppfrance.com/codes/WIN32-LIRE-FICHIER-LIGNE-LIGNE_44453.aspx
char szFile[] = "blacklist.cfg";
int i;
LPOPENL lpoLine;
char szIP[32];
lpoLine = OpenLine(szFile, GetTypeOfFile(szFile));
for(i=0; i!=10; i++)
{
ReadLine(lpoLine, i, szIP);
printf("Ligne %i : %s", i, szIP);
}
CloseLine(lpoLine);
Neo_Fr
|
|
vendredi 23 mai 2008 à 22:50:10 |
Re : lire un fichier ligne par ligne

SAKingdom
|
Lire par bloc (plusieurs ko) voir tout le fichier d'un coup. Étant donné que les lignes dans le fichier doivent probablement avoir toutes la même taille (16 si on inclut le \n 17 si fichier Windows \r\n), ça ne sera pas bien dur de traiter correctement le buffer et, surtout, ce sera bien plus rapide. C++ (@++)
|
|
samedi 24 mai 2008 à 00:56:44 |
Re : lire un fichier ligne par ligne

jOlcoWboY
|
oula en effet j'ai pas fait un copié collé mais je l'ai retapé donc ya plein d'erreur comme l'affectation pour le teste qui est bien sur un "!=".. :s
pour ce qui est de la taille des ip dans mon fichier il se trouve que non elle non pas toute la meme taille. (ip v4, ip v6 avec des mixes aussi pour des ports... donc taille variables) donc la taille du buffer reste indeterminée :/
et pour le gets(f) c bien sur un getc(f) :s...
en fait ca marche c pas ca le principe ... j'aurais juste aimé savoir si mon algo en soit pouvait etre amélioré ou pas.. (si vraiment vous voulez je peux placer la source "corrigé" (copié/collé) ).
Merci en tout cas a vous pour vos critiques, j'aurais fait les memes ^^
-= j l'coWboY =-
|
|
samedi 24 mai 2008 à 03:28:26 |
Re : lire un fichier ligne par ligne

SAKingdom
|
Bien sur qu'il peut être amélioré. Lire caractère par caractère puis faire un realloc à chaque caractère est tout simplement catastrophique pour les performances. Comme je disais, tu peux lire tout d'un coup si le fichier n'est pas trop gros puis faire les traitements sur le buffer. Tu peux aussi lire par bloc. Si tu souhaite cependant rester avec une lecture ligne par ligne (que je déconseille fortement pour des projets plus ambitieux), tu peux utiliser fgets. Pour la taille du buffer, suffit de créer un tableau de char pouvant contenir la plus grande valeur possible sur une ligne. C++ (@++)
|
|
samedi 24 mai 2008 à 14:02:26 |
Re : lire un fichier ligne par ligne

jOlcoWboY
|
1h oui pas bête du tout, moi je m'obstinais à parser mon fichier..je vais parser mon buffer alors. Par contre je vais devoir trouvé une technique pour pouvoir lire un fichier de taille illimitée... Merci bien je vois comment faire! (enfin je crois ^^) Une derniere question, connaissez vous des noms de programmes qui permettent de calculer l'optimisation d'un programme ? (le temps, le nombre de directives processeurs, la charge du CPU, etc...) Si je suis ton principe SAKingdom, je vais devoir tenter d'optimiser la taille de mon buffer, ni trop grande ni trop petite.
Merci bien en tout cas a vous ;)
-= j l'coWboY =-
|
|
samedi 24 mai 2008 à 16:42:46 |
Re : lire un fichier ligne par ligne

SAKingdom
|
Réponse acceptée !
" "Par contre je vais devoir trouvé une technique pour pouvoir lire un fichier de taille illimitée..."
Lecture par bloc (fread, fseek). Pour tester si on arrive à la fin du buffer, on peut, par exemple, placer comme dernier caractère, un 0 de fin de chaine. Disons que chaque adresse est séparée l'une de l'autre par un saut de ligne, si on tombe sur le 0 de fin de chaine avant le \n (d'après le topic tu es sous Linux), on relit le fichier à partir du dernier \n trouvé (dépend de la méthode que tu souhaites employer) pour ainsi replacer au début du buffer (et donc traiter) l'adresse qui a été tronquée.
" je vais devoir tenter d'optimiser la taille de mon buffer, ni trop grande ni trop petite."
Ne te gène pas : Lis par bloc de plusieurs ko voir mo.
"Pour la taille du buffer, suffit de créer un tableau de char pouvant contenir la plus grande valeur possible sur une ligne." Ici, je voulais parler de la taille du buffer si tu utilisais fgets. Autrement, étant donnée que les lignes de ton fichier ne sont jamais pareilles, la taille du buffer ne devrait pas en tenir compte.
C++ (@++)
|
|
Cette discussion est classée dans : fichier, ligne, lire, char, if
Répondre à ce message
Sujets en rapport avec ce message
Debutant : ecrire et lire un fichier txt [ par manu ]
Bonjour a tous.Je debute, aussi desole.... :)Je cherche donc a ecrire dans un fichier txt, puis a lire ce fichier ligne a ligne, faire un split / expl
probléme d'écriture fichier [ par phoenixadb ]
phoenixadbJ'ai un problème sur une fonction que je n'arrive pas à résoudremon nom de fichier est test.txtet ma fonction:void ecriturefichier(char* nom
Lire un fichier Texte Ligne par ligne [ par Ricpperso ]
Bonjour,bon je fai un pti proget je voudrai savoir comment on fais pour lire un fichier Texte ligne par ligne, avec si possible le Cfile.merci d'avanc
Lire une ligne d'un fichier texte [ par CassusGreg ]
Salut à tous,Est-ce-qu'il existe une fonction pour lire une ligne de texte (terminé par 0x0D 0x0A) dans un fichier?Je suis sous VC++ 6merci
Lire dans un fichier ligne par ligne [ par curator68 ]
Voilà, j'ai un fichier sur mon disque, et j'aimerai lire le contenu ligne par ligne dans mon programme. J'utilise Visual C++ de Visual Studio 6.0 sp5.
Lire dans un fichier [ par Psyc0s ]
J'ai un fichier dans lequel je stock des log donc il n'a jamais le meme nombre de ligne. J'aurais besoin de mettre chacque ligne dans une variable(di
lire un fichier txt ligne par ligne [ par lapinrose67 ]
Bonsoir,Je developpe un logiciel en C sous Linux, voila mon problème:Je dois lire un fichier texte ligne par ligne et placer chacune d'entre ellesdans
lire fichier ligne par ligne [ par mat74 ]
salut a ts je voudrai savoir comment je pourrai lire un fichier lignes par lignes . par exemple une fonction qui me permerttrai de recuperer la ligne
lire une ligne dans un fichier texte puis........ [ par oudkaramla ]
salut out le monde,je veux lire 3 lignes d'un fichier texte, puis faire le découpage de chaque ligne en petits morceauxje sais qu'il ft faire fopen()
Lire une ligne dans un fichier [ par StevenJLMunn ]
J'ai besoin d'une fonction qui lit juste une ligne dans un fichier text.J'utilise Visual C++ c'est une win32 consol application.Ca fait pas très longt
Livres en rapport
|
Derniers Blogs
TECHDAYS PARIS 2012 : NOUVELLES TENDANCES DU POSTE DE TRAVAIL - BRING YOUR OWN PCTECHDAYS PARIS 2012 : NOUVELLES TENDANCES DU POSTE DE TRAVAIL - BRING YOUR OWN PC par ROMELARD Fabrice
Speakers: Thierry Rapatout, Antoine Petit et Xavier Trebbia Cette session entre dans le cadre des RDV Décideurs des TechDays 2012, elle est liée à la consumérisation de l'IT et la mise en place du "DeskTop as a Service" dans de plus en ...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice TECHDAYS PARIS 2012 : SYSTEM CENTER SERVICE MANAGER 2012 VUE D'ENSEMBLETECHDAYS PARIS 2012 : SYSTEM CENTER SERVICE MANAGER 2012 VUE D'ENSEMBLE par ROMELARD Fabrice
Speakers: Julien Marechal, Gautier Confiant, Sébastien MEYER La session débute par le positionnement de la solution System Center par rapport aux concepts d'organisation ITIL. Le portail du catalogue de se...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice TECHDAYS PARIS 2012 : PLEINIèRE SECOND JOURTECHDAYS PARIS 2012 : PLEINIèRE SECOND JOUR par ROMELARD Fabrice
Après une première journée dédiée aux développeurs, cette seconde journée est dédiée au monde des entreprises et de ses applications. Ainsi, cette pleinière est dédiée à faire un 360 de l'évolution des applications Business aux demandes ac...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice TECHDAYS PARIS 2012 : RETOUR D'EXPéRIENCE SUR LA MISE EN PLACE D'UN CLOUD PRIVéTECHDAYS PARIS 2012 : RETOUR D'EXPéRIENCE SUR LA MISE EN PLACE D'UN CLOUD PRIVé par ROMELARD Fabrice
Speaker : Guillaume Rochette Cette session est dédiée à fournir le retour sur la mise en place d'un cloud privé (IaaS) par Osiatis pour son compte ou celui de ses clients. Ce projet s'est déroulé sur 4 mois et a permis de faire évoluer...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice TECHDAYS PARIS 2012 : COMMENT SHAREPOINT A SAUVé MES TECHDAYSTECHDAYS PARIS 2012 : COMMENT SHAREPOINT A SAUVé MES TECHDAYS par ROMELARD Fabrice
Speakers : Lionel Limozin et Alain Marty La session commence par une découverte de SharePoint à travers la mise en place d'un environnement SharePoint pour la gestion des Sessions animées par BeWise. Le besoin est très ba...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Forum
AUMLAUML par sassion
Cliquez pour lire la suite par sassion
Logiciels
Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning COLLECTOR PLUS (3.00B)COLLECTOR PLUS (3.00B)COLLECTOR PLUS version 3.00B est un logiciel utilisant une base de données alimentée par :
- L... Cliquez pour télécharger COLLECTOR PLUS PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO LettresFaciles 2011 (8.0.0.1)LETTRESFACILES 2011 (8.0.0.1)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011
|