web-dev-qa-db-fra.com

Lire la ligne d'un fichier texte et mettre les chaînes dans un vecteur?

J'essaie de lire chaque ligne d'un fichier texte dont chaque ligne contient un mot et de mettre ces mots dans un vecteur. Comment pourrais-je procéder?

Voici mon nouveau code: je pense qu'il y a encore quelque chose qui ne va pas.

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;

int main()
{
    std::string line;
    vector<string> DataArray;
    vector<string> QueryArray;
    ifstream myfile("OHenry.txt");
    ifstream qfile("queries.txt");

    if(!myfile) //Always test the file open.
    {
        cout<<"Error opening output file"<<endl;
        system("pause");
        return -1;
    }
    while (std::getline(qfile, line))
    {
        QueryArray.Push_back(line);
    }
    if(!qfile) //Always test the file open.
    {
        cout<<"Error opening output file"<<endl;
        system("pause");
        return -1;
    }

    while (std::getline(qfile, line))
    {
        QueryArray.Push_back(line);
    }

    cout<<QueryArray[0]<<endl;
    cout<<DataArray[0]<<endl;

}
23
user977154

@FailedDev a, en effet, répertorié la forme la plus simple. Comme alternative, voici comment je code souvent cette boucle:

std::vector<std::string> myLines;
std::copy(std::istream_iterator<std::string>(myfile),
          std::istream_iterator<std::string>(),
          std::back_inserter(myLines));

L'ensemble du programme pourrait ressembler à ceci:

// Avoid "using namespace std;" at all costs. Prefer typing out "std::"
// in front of each identifier, but "using std::NAME" isn't (very) dangerous.
#include <iostream>
using std::cout;
using std::cin;
#include <fstream>
using std::ifstream;
#include <string>
using std::string;
#include <vector>
using std::vector;
#include <iterator>
using std::istream_iterator;
#include <algorithm>
using std::copy;

int main()
{

    // Store the words from the two files into these two vectors
    vector<string> DataArray;
    vector<string> QueryArray;

    // Create two input streams, opening the named files in the process.
    // You only need to check for failure if you want to distinguish
    // between "no file" and "empty file". In this example, the two
    // situations are equivalent.
    ifstream myfile("OHenry.txt"); 
    ifstream qfile("queries.txt");

    // std::copy(InputIt first, InputIt last, OutputIt out) copies all
    //   of the data in the range [first, last) to the output iterator "out"
    // istream_iterator() is an input iterator that reads items from the
    //   named file stream
    // back_inserter() returns an interator that performs "Push_back"
    //   on the named vector.
    copy(istream_iterator<string>(myfile),
         istream_iterator<string>(),
         back_inserter(DataArray));
    copy(istream_iterator<string>(qfile),
         istream_iterator<string>(),
         back_inserter(QueryArray));

    try {
        // use ".at()" and catch the resulting exception if there is any
        // chance that the index is bogus. Since we are reading external files,
        // there is every chance that the index is bogus.
        cout<<QueryArray.at(20)<<"\n";
        cout<<DataArray.at(12)<<"\n";
    } catch(...) {
        // deal with error here. Maybe:
        //   the input file doesn't exist
        //   the ifstream creation failed for some other reason
        //   the string reads didn't work
        cout << "Data Unavailable\n";
    }
}
32
Robᵩ

Forme la plus simple:

std::string line;
std::vector<std::string> myLines;
while (std::getline(myfile, line))
{
   myLines.Push_back(line);
}

Pas besoin de trucs fous c :)

Éditer:

#include <iostream>
#include <fstream>
#include <string>
#include <vector>

int main()

{
    std::string line;
    std::vector<std::string> DataArray;
    std::vector<std::string> QueryArray;
    std::ifstream myfile("OHenry.txt");
    std::ifstream qfile("queries.txt");

    if(!myfile) //Always test the file open.
    {
        std::cout<<"Error opening output file"<< std::endl;
        system("pause");
        return -1;
    }
    while (std::getline(myfile, line))
    {
        DataArray.Push_back(line);
    }

    if(!qfile) //Always test the file open.
    {
        std::cout<<"Error opening output file"<<std::endl;
        system("pause");
        return -1;
    }

    while (std::getline(qfile, line))
    {
        QueryArray.Push_back(line);
    }

    std::cout<<QueryArray[20]<<std::endl;
    std::cout<<DataArray[12]<<std::endl;
    return 0;
}

L'utilisation de mots clés est illégale en C++! Ne l'utilisez jamais. D'accord? Bien. Comparez maintenant ce que j'ai écrit avec ce que vous avez écrit et essayez de découvrir les différences. Si vous avez encore des questions, revenez.

31
FailedDev

Version la plus simple:

std::vector<std::string> lines;
for (std::string line; std::getline( ifs, line ); /**/ )
   lines.Push_back( line );

J'omets les inclusions et autres trucs. Ma version est presque la même que celle de FailedDev mais en utilisant une boucle 'for', je mets la déclaration de 'line' dans la boucle. Ce n'est pas seulement une astuce pour réduire le nombre de lignes. Cela réduit la portée de la ligne - elle disparaît après la boucle for. Toutes les variables doivent avoir la plus petite portée possible, c'est donc mieux. Car les boucles sont géniales.

19
Bruce Dawson