2010-01-18 5 views
0

J'essaie de savoir quelle est la meilleure façon de lire des fichiers de texte volumineux (au moins 5 Mo) en C++, compte tenu de la rapidité et de l'efficacité. N'importe quelle classe ou fonction préférée à utiliser et pourquoi? Par ailleurs, je cours spécifiquement sur l'environnement UNIX.Lecture de fichiers texte

+0

Je pense que vous devriez spécifier le système d'exploitation depuis son OS spécifique plutôt comment lire rapidement. par exemple. Windows autorise les fichiers mappés en mémoire –

+0

La réponse dépend également de ce que vous avez l'intention de faire avec le texte. Et Unix a aussi des fichiers mappés en mémoire. – Omnifarious

+0

Si vous ne faites pas de travail ou si vous faites un projet qui nécessite C++, ne réinventez pas la roue, dans Linux, il y a beaucoup d'outils (en C/C++) qui lisent les fichiers, par exemple grep, awk, etc. vouloir faire cela en C/C++, vous pouvez vérifier leurs sources et voir comment c'est fait. – ghostdog74

Répondre

0

Les classes de flux (ifstream) fonctionnent réellement bien; En supposant que vous ne soyez pas restreint, assurez-vous de désactiver sync_with_stdio (dans ios_base: :). Vous pouvez utiliser getline() pour lire directement dans std :: strings, mais du point de vue des performances, utiliser un tampon fixe comme char * (vecteur de chars ou old-school char []) peut être plus rapide (plus de risques/complexité)).

Vous pouvez utiliser l'itinéraire mmap si vous souhaitez jouer à des jeux avec des calculs de taille de page, etc. Je vais probablement le construire d'abord en utilisant les classes de flux et voir si c'est assez bon. En fonction de ce que vous faites avec chaque ligne de données, vous pouvez commencer à trouver vos routines de traitement comme point d'optimisation et non comme E/S.

+0

Pour ifstreams, quel est son avantage par rapport à fread()? – jasonline

+0

Performance-sage, je m'attends à ce qu'ils soient à peu près les mêmes. En ce qui concerne la maintenance du code, je préfère traiter les classes de flux. – Joe

0

Utilisez l'ancien fichier de style io.

fopen the file for binary read 
fseek to the end of the file 
ftell to find out how many bytes are in the file. 
malloc a chunk of memory to hold all of the bytes + 1 
set the extra byte at the end of the buffer to NUL. 
fread the entire file into memory. 
create a vector of const char * 
push_back the address of the first byte into the vector. 
repeatedly 
    strstr - search the memory block for the carriage control character(s). 
    put a NUL at the found position 
    move past the carriage control characters 
    push_back that address into the vector 
until all of the text in the buffer has been processed. 

---------------- 
use the vector to find the strings, 
and process as needed. 
when done, delete the memory block 
and the vector should self-destruct. 
+0

Comment est-ce mieux que les classes de flux? – jasonline

+0

ancien fichier de style io est isomorphe aux flux. vous pouvez le faire de toute façon. Il s'agit de la fusion de tout le fichier en une fois, et l'analyse des chaînes qui est importante. – EvilTeach

0

Si vous utilisez un fichier texte stockant les entiers, flottants et les petites chaînes, mon expérience est que FILE, fopen, fscanf sont déjà assez vite et vous pouvez également obtenir les numéros directement. Je pense que le mappage de la mémoire est le plus rapide, mais il vous oblige à écrire du code pour analyser le fichier, ce qui nécessite un travail supplémentaire.