C ++: Question de suivi à la lecture d'un fichier externe à l'aide de GetLine ().Comment obtenir un sous-ensemble des données de fichier?
-
14-11-2019 - |
Question
Je dois lire en numéros à partir d'un fichier externe et les stocker dans un vecteur d'INTS. Je peux le faire maintenant grâce à Howard Hinnant et Wilhelmtell, qui a patiemment contribué à comprendre pourquoi mon codage ne fonctionnait pas hier.
J'ai essayé de déterminer comment intégrer une fonctionnalité supplémentaire dans le code, mais j'ai épuisé ma connaissance des ruisseaux et j'apprécierais certains conseils.
Je veux être en mesure de traiter des fichiers contenant de nombreux ensembles de données. Est-il possible d'extraire certaines données du fichier dans un vecteur? Je veux retrouver plusieurs vecteurs contenant des données de différentes parties du fichier. J'ai cherché en ligne, mais n'ai vu aucune mention de cela.
Voici le code plus un exemple de fichier (appelons-le "Test") que je souhaite obtenir des données de.
edit: J'ai édité le code basé sur les conseils de Cashcow. Je peux maintenant obtenir un bloc du fichier de données. Mais je ne sais pas comment obtenir le bloc que je veux. Si j'exécute le code tel qu'il est, je reçois un vecteur qui contient les éléments 2,5,8 (ce n'est pas ce que je veux). Pour obtenir VectorTwo (4,5,6 dans l'exemple que j'ai fait), j'ai essayé d'ajouter cela autour de la déclaration tandis que:
if( line == "vectorTwo" )
{
// The while statement and its contents
}
Cela n'a pas fonctionné. Je n'ai reçu aucun résultat d'exécution du code (cela compilait-le). Quelqu'un peut-il voir quel est le problème? J'ai pensé que je pourrais utiliser cette déclaration pour rechercher l'en-tête pour le bloc de données dont j'ai besoin.
// Voici le contenu du fichier exemple
Identifiant vectoriel // pour sous-ensemble de données pour un vecteur
'1' '2' '3'
vectorwo
'4' '5' '6'
Vectorhree // Identifiant pour sous-ensemble de données pour un autre vecteur
'7' '8' '9'
// code:
Le caractère '\' 'est le délimiteur de ligne. Tout est ignoré jusqu'au premier »et puis tout jusqu'à ce que la prochaine 'fait partie d'un nombre. Ceci continue jusqu'à ce que la logique échoue (fin du fichier). Comment puis-je le faire arrêter à la fin d'un bloc de données à la place?
#include <fstream>
#include <iostream>
#include <vector>
#include <string>
#include <sstream>
#include <iterator>
int main()
{
std::string line;
std::string block; // Edited, from CashCow
const std::string fileName = "test.dat";
std::ifstream theStream( fileName.c_str() );
if( ! theStream )
std::cerr << "Error opening file test.dat\n";
std::vector<int> numbers; // This code is written for one vector only. There would be three vectors for the example file I provided above; one for the vectorOne data in the file, and so on.
while (true)
{
// get first '
std::getline(theStream, line, '\'');
// read until second '
std::getline(theStream, line, '\'');
std::istringstream myStream( line );
std::getline( theStream, block, '\n' ); // Edited, from CashCow
std::istringstream blockstream( block ); // Edited, from CashCow
std::getline(blockstream, line, '\''); // Edited, from CashCow
int i;
myStream >> i;
if (myStream.fail())
break;
numbers.push_back(i);
}
std::copy(numbers.begin(), numbers.end(),
std::ostream_iterator<int>(std::cout, "\n"));
}
La solution
Lorsque vous atteignez le démarrage d'un bloc, il suffit de lire à la fin de la ligne dans une chaîne, puis d'analyser la chaîne.
std::getline( theStream, block, '\n' );
std::istringstream blockStream( block );
std::getline( blockStream, line, '\'' ); // etc