begin process at 2008 08 29 22:22:10
1 233 910 membres
431 nouveaux aujourd'hui
14 294 membres club

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é: 7 251 / 323

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..
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

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..
  • 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

Pub



Appels d'offres

Recherche developpeur ...
Budget : 700€
SITE MARCHAND LOCATION...
Budget : 3 000€
SITE MARCHAND POUR HOTEL
Budget : 4 000€

CalendriCode

Août 2008
LMMJVSD
    123
45678910
11121314151617
18192021222324
25262728293031

Téléchargements

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

Boutique

Boutique de goodies CodeS-SourceS