je les données suivantes qui ressemble à ceci par exemple:Comment puis-je analyser correctement mon fichier? (Avec pause/continuer)
34 foo
34 bar
34 qux
62 foo1
62 qux
78 qux
Ils sont triés en fonction de la première colonne.
Ce que je veux faire est de traiter les lignes commençant par 34, mais je veux aussi l'itération de fichier à quitter après ne trouve plus 34s, sans avoir à analyser par fichier entier. Comment ferais-je cela? La raison en est que le nombre de lignes à traiter est très important (~ 10^7). Et ceux qui commencent par 34 n'en représentent qu'environ 1-10%.
Je suis conscient que je peux grep les lignes et la sortie dans un autre fichier, mais cela est trop fastidieux et crée plus de consommation d'espace disque.
Ce code illustre ma tentative a échoué en utilisant "continuer":
#include <iostream>
#include <vector>
#include <fstream>
#include <sstream>
using namespace std;
int main() {
string line;
ifstream myfile ("mydata.txt");
vector<vector<string> > dataTable;
if (myfile.is_open())
{
while (! myfile.eof())
{
stringstream ss(line);
int FirstCol;
string SecondCol;
if (FirstCol != 34) {
continue;
}
// This will skip those other than 34
// but will still iterate through all the file
// until the end.
// Some processing to FirstCol and SecondCol
ss >> FirstCol >> SecondCol;
cout << FirstCol << "\t << SecondCol << endl;
}
myfile.close();
}
else cout << "Unable to open file";
return 0;
}
Un interrupteur avec seulement 1 cas et un défaut semble être un si-alors-autre pour moi ... –
@Luc: Bien sûr, allez-y. C'est vraiment juste une question de style et de préférences. J'aime les interrupteurs. –
Malheureusement, ce code a toujours le bug dangereux que j'ai mentionné lié à la boucle infinie ('while (! File.eof())'). –