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; }
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.
@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"; } }
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With