Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

[C / WIN32] LIRE UN FICHIER LIGNE PAR LIGNE


Information sur la source

Catégorie :Fichiers / Disque Classé sous : lire, fichier, ligne, File Mapping, ReadLine Niveau : Débutant Date de création : 21/10/2007 Date de mise à jour : 22/02/2008 00:15:46 Vu / téléchargé: 9 172 / 372

Note :
Aucune note

Commentaire sur cette source (7)
Ajouter un commentaire et/ou une note


Description

Fonctions permettant de lire un fichier ligne par ligne facilement et rapidement...
Supporte les fichiers texte creer sous windows, mac ou unix.

LPOPENL __stdcall OpenLine(LPSTR FileName, BYTE FileType);
DWORD __stdcall ReadLine(LPOPENL lpoLine, DWORD nLine, LPSTR LineOut);
void __stdcall CloseLine(LPOPENL lpoLine);
int __stdcall GetTypeOfFile(LPSTR FileName);
 

Source

  • S'utilise comme suit:
  • LPOPENL lpoLine;
  • lpoLine = OpenLine(Nom_Du_Fichier, Type_Du_Fichier);
  • Si vous connaissez deja le type du fichier remplacer Type_Du_Fichier par une des define suivante:
  • OPENL_WINDOWS_FILE
  • OPENL_UNIX_FILE
  • OPENL_MAC_FILE
  • Sinon Utiliser GetTypeOfFile(Nom_Du_Fichier) qui retournera une des valeurs ci dessus...
  • ReadLine(lpoLine, Numero_de_la_ligne, Buffer_De_Retour);
  • Pour connaitre la taille d'une ligne:
  • ReadLine(lpoLine, Numero_de_la_ligne, 0);
  • et une fois que vous avez fini ne pa oublier d'apeller CloseLine
  • CloseLine(lpoLine);
S'utilise comme suit:

LPOPENL lpoLine;
lpoLine = OpenLine(Nom_Du_Fichier, Type_Du_Fichier);

Si vous connaissez deja le type du fichier remplacer Type_Du_Fichier par une des define suivante:
 OPENL_WINDOWS_FILE
 OPENL_UNIX_FILE
 OPENL_MAC_FILE

Sinon Utiliser GetTypeOfFile(Nom_Du_Fichier) qui retournera une des valeurs ci dessus...

ReadLine(lpoLine, Numero_de_la_ligne, Buffer_De_Retour);

Pour connaitre la taille d'une ligne:
ReadLine(lpoLine, Numero_de_la_ligne, 0);

et une fois que vous avez fini ne pa oublier d'apeller CloseLine
CloseLine(lpoLine);

Conclusion

Voila..

 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

21 octobre 2007 22:49:42 :
maj...
22 octobre 2007 17:09:22 :
Utilisation du File Mapping...
22 février 2008 00:15:47 :
maj..

Commentaires et avis

signaler à un administrateur
Commentaire de BruNews le 21/10/2007 20:16:20 administrateur CS

NON et NON, on ne peut pas présenter une source dans cet état.

FileSize = GetFileSize(hFile, 0);
GetFileSize nécessite une vérif d'erreur avec GetLastError
Buffer = (BYTE*) HeapAlloc(...);
Encore vérif du retour NULL obligatoire avant ReadFile(...);

Partout des:
if(condition == v) ...;
if(condition == w) ...;
if(condition == x) ...;
Mettre else if(...), quand c'est blanc c'est pas noir.

HeapAlloc() est fait pour allouer de petits blocs de mémoire, en aucun cas d'immenses blocs pour y mapper un fichier entier.
Tes fonctions ne pourront jamais être utilisées en multi thread pour cause de HEAP_NO_SERIALIZE sur le heap par défaut du processus, c'est à proscrire comme méthode.

Si tout le fichier ne tient pas en mémoire, on fait comment ?

On va conclure par une solution possible:
FileMapping sur le fichier, pousser pointeur pDeb jusque début de la ligne voulue, pousser pEnd partant de pDeb jusque fin de ligne. Alloc de (pEnd - pDeb) octets et y copier les octets.

signaler à un administrateur
Commentaire de Neo_Fr le 21/10/2007 21:25:19

Un petit bloc c'est tres vague.. moins de 1mo? - de 10mo? precise stp
Pour le pb avec HEAP_NO_SERIALIZE si je creer un heap avec HeapCreate ca regle le pb?

Neo_Fr

signaler à un administrateur
Commentaire de BruNews le 21/10/2007 21:34:04 administrateur CS

Avec heap limité au thread qui s'en servira alors no prob pour HEAP_NO_SERIALIZE.
Par principe, utiliser VirtualAlloc pour blocs >= 4 Mo.

signaler à un administrateur
Commentaire de Neo_Fr le 21/10/2007 22:54:01

Je me suis contenter de controler les retours de fonctions..
Pour la lecture du fichier bloc par bloc sa devener trop compliquer et trop risquer..
Si ta d'autre conseilles hesite pas..

Neo_Fr

signaler à un administrateur
Commentaire de BruNews le 22/10/2007 00:24:00 administrateur CS

Utilise le FileMapping comme dit plus haut, en balladant un pointeur dedans c'est le systeme qui assurera le chargement par taille de page mémoire à ta place.

signaler à un administrateur
Commentaire de Neo_Fr le 22/10/2007 17:13:34

J'ai pas trouver beaucoup d'exemples sur le File Mapping, ca a l'air de marcher mais si je charge un fichier de 80mo ca prend tjrs 80mo en memoire...

Neo_Fr

signaler à un administrateur
Commentaire de tibur le 25/10/2007 10:03:42

A possible benefit of memory-mapped files is a "lazy loading", thus using small amounts of RAM even for a very large file. Trying to load the entire contents of a file that is significantly larger than the amount of memory available can cause severe thrashing as the operating system reads from disk into memory and simultaneously pages from memory back to disk. Not only memory-mapping may bypass the page file completely, but the system only needs to load the smaller page-sized sections as data is being edited, similarly to demand paging scheme used for programs.
[http://en.wikipedia.org/wiki/Memory-mapped_file]

En gros, ça veut dire que quand tu veux faire une édition dans une partie de ton fichier mappé, l'OS va charger en mémoire un bout du fichier (1k,4k ? taille des pages ?). Si tu fais une écriture, il va ensuite la répercuter sur le fichier. Mais en aucun cas il y a une correspondance directe entre mémoire utilisée par le programme et la taille du fichier. (Encore que pour un petit fichier, genre 80Mo, ya tout de même des chances qu'il soit entierement en mémoire!)

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

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 [ 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 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() lecture fichier C++ [ par biscot19 ] bonjour, je voudrais savoir comment faire pour lire un fichier ligne par ligne par exemple je demande a mon prog de lire la 3eme ligne il doit me reto Lire données dans un fichier Excel en C [ par skrime ] Bonjour, J'aimerais lire les données contenues dans un fichier excel, j'aimerais pouvoir lire ligne par ligne, je ne sais pas du tout comment on


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version


LG KP501

Entre 9€ et 159€


Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,484 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.