Lettura linea dal file di testo e mettendo le stringhe in un vettore?

Sto cercando di leggere ogni riga di un file di testo che ogni riga contiene una parola e mettere quelle parole in un vettore. Come potrei fare per farlo?

Questo è il mio nuovo codice: penso che ci sia ancora qualcosa di sbagliato in questo.

#include  #include  #include  #include  using namespace std; int main() { std::string line; vector DataArray; vector 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; } 

@FailedDev ha, infatti, elencato la forma più semplice. In alternativa, ecco come faccio spesso a codificare quel ciclo:

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

L’intero programma potrebbe assomigliare a questo:

 // 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  using std::cout; using std::cin; #include  using std::ifstream; #include  using std::string; #include  using std::vector; #include  using std::istream_iterator; #include  using std::copy; int main() { // Store the words from the two files into these two vectors vector DataArray; vector 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(myfile), istream_iterator(), back_inserter(DataArray)); copy(istream_iterator(qfile), istream_iterator(), 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< 

La forma più semplice:

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

Non c’è bisogno di cose folli 🙂

Modificare:

 #include  #include  #include  #include  int main() { std::string line; std::vector DataArray; std::vector 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"< 

L'uso di parole chiave è illegale C ++! Non usarlo mai. ok? Buona. Ora confronta ciò che ho scritto con ciò che hai scritto e cerca di scoprire le differenze. Se hai ancora domande torna.

La versione più semplice:

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

Sto omettendo gli include e altri gunk. La mia versione è quasi la stessa di FailedDev ma usando un ciclo ‘for’ ho inserito la dichiarazione di ‘line’ nel ciclo. Questo non è solo un trucco per ridurre il numero di linee. Questo riduce l’ambito della linea – scompare dopo il ciclo for. Tutte le variabili dovrebbero avere il più piccolo ambito ansible, quindi quindi è meglio. Per i loop sono fantastici.