Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Reading line from text file and putting the strings into a vector?

Tags:

c++

fstream

I am trying to read each line of a textfile which each line contains one word and put those words into a vector. How would i go about doing that?

This is my new code: I think there is still something wrong with it.

#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;  } 
like image 526
user977154 Avatar asked Dec 03 '11 02:12

user977154


People also ask

Can you make a vector of strings?

A vector of strings is created the way a vector of any other type would be created. Remember to make the template specialization, string. Do not forget to include the string library and the vector library. The common ways of creating vectors with string as the element type have been illustrated above.


2 Answers

@FailedDev did, indeed, list the simplest form. As an alternative, here is how I often code that loop:

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

The entire program might look like this:

// 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";     } } 
like image 155
Robᵩ Avatar answered Sep 18 '22 13:09

Robᵩ


Simplest form:

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

No need for crazy c thingies :)

Edit:

#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; } 

Keyword using is illegal C++! Never use it. OK? Good. Now compare what I wrote with what you wrote and try to find out the differences. If you still have questions come back.

like image 39
FailedDev Avatar answered Sep 20 '22 13:09

FailedDev