2012-08-28 5 views
-1

J'ai un fichier texte avec les nombres comme suit: num1 TAB num2 TAB .... num22 newline . . .Fichier C++ E/S Données séparées par des tabulations

Je voudrais lire num1 vérifier pour voir si elle est égale à 3 et si oui, copier la ligne entière dans un nouveau fichier. Quel est le moyen le plus rapide de le faire? Le fichier est assez gros 80Mb +. En outre, num 1 est répétitif, c'est-à-dire qu'il va de 0 à 3 par pas de 0,001. Je dois donc lire toutes les étapes. Je ne suis pas sûr de savoir comment dire à l'ordinateur de sauter a-priori x-lines?

Merci.

+1

Avez-vous vraiment besoin d'utiliser C++ pour cela? "" grep -P '^ 3 \ t' "' ou similaire ferait ce que vous voulez, et sera très rapide. –

+0

Dans quelle mesure êtes-vous concerné par les performances d'exécution? C'est trivial à faire avec les flux stdlib, mais si vous êtes inquiet au sujet des frais généraux, alors [Boost.Spirit] (http://www.boost.org/libs/spirit/) .Qi est le chemin à parcourir. – ildjarn

+0

(Note: 'grep -P' nécessite gnu grep) –

Répondre

1

Étant donné que vous avez dit que la performance d'exécution ne sont pas une préoccupation majeure, alors ce qui suit est claire et concise:

#include <string> 
#include <fstream> 

void foo(std::string const& in_fn, std::string const& out_fn) 
{ 
    std::ifstream is(in_fn); 
    std::ofstream os(out_fn); 

    std::string line; 
    while (std::getline(is, line)) 
     if (line.size() && std::stoi(line) == 3) 
      os << line << '\n'; 
} 

(C + +11 support supposé, la gestion des erreurs est omise par souci de brièveté.)

+0

Merci. D'autres s'il vous plaît noter que vous devez entrer le chemin complet des fichiers d'entrée et de sortie, à savoir l'utilisation est: int main() { \t foo ("F:/Lecteur de sauvegarde/file_read/Debug/save_data.txt", "F :/Lecteur de sauvegarde/file_read/Debug/sorted.txt "); } –

+0

Si pour une raison quelconque vous voulez dire 2,999 au lieu de 3, utilisez std :: stod au lieu de std :: stoi. J'ai essayé et ça a marché! –

+0

Question rapide, comment obtenir la ligne précédente? Puisque 0 suit 3 (dans mon ensemble de données), je voudrais vérifier un 0 et stocker la ligne précédente. –

1

pseudo-code peut ressemble à ceci:

while (not eof) { 
    fgets(...); 
    find TAB symbol or end of line 
    get string between two marks 
    cleain it from spaces and other unnecessary symbols 
    float fval = atof(...); 
    if (fval == 3) { 
     write the string into new file 
    } 

} 
+0

Merci! J'ai utilisé votre pseudo-code mais malheureusement SE ne me laisse pas sélectionner plus d'une réponse acceptée. S'il y a un moyen de créer rétroactivement une prime, s'il vous plaît faites le moi savoir. Je voudrais vous donner une partie de mon représentant. –

Questions connexes