C ++: Question de suivi à la lecture d'un fichier externe à l'aide de GetLine ().Comment obtenir un sous-ensemble des données de fichier?

StackOverflow https://stackoverflow.com/questions/5005673

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 // comment puis-je obtenir ce vecteur? Ou tout autre vecteur?

'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"));
}

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top