4

I am trying to write a program where I read a text file and then take each line in the textfile and store them in a string vector. I think I am able to open the textfile however I noticed that after I open the textfile anything after that point does not execute. For example I have a cout statement at the end of my main function that outputs when I enter the name of a file that doesn't exist. However if I type in a file name does exists I get no output from the last cout statement. Anyone know why this is? Thanks!


int main()
{
    vector<string>line;
    string fileName = "test.txt";
    ifstream myFile(fileName.c_str());
    int i = 0;
    int count = 0;
    vector<string>lines;
        cout << "test" << endl;



    if (myFile.is_open())
    {
            cout << "test2" << endl;    
            while (!myFile.eof())
            {
                getline(myFile, lines[i],'\n');
                i++;
            }
            myFile.close();

    }
        if (!myFile.is_open())
        {
            cout<< "File not open"<< endl;
        }
        myFile.close();

        cout << "Test3" <<endl;




        return 0;
}

Andrew.b
  • 45
  • 3

2 Answers2

4

Try this:

string fileName = "test.txt";
ifstream myFile(fileName); // .c_str() not needed - ifstream can take an actual string
vector<string> lines;

string line; // temporary variable for std::getline
while (getline(myFile, line)) {
   lines.push_back(line); // use push_back to add new elements to the vector
}

As pointed out in the comments, the most likely reason that your program seems to "end" prematurely is that it's crashing. std::getline takes a reference-to-string as its second argument. In your code, your vector is empty; therefore lines[i] for any i returns a reference to invalid memory. When getline tries to access that memory, the program crashes.

If you want an exception thrown when you try to access an out-of-bounds index of a vector, use lines.at(i) instead of lines[i].

Community
  • 1
  • 1
qxz
  • 3,697
  • 1
  • 11
  • 29
2

You need to use push_back() because your initial vector is empty and, you can not use indexes on empty vector. If you do so, it will leads to undefined behavior.

std::ifstream input( "filename.ext" );
std::vector<std::string> lines;
for( std::string line; getline( input, line ); )
{
    lines.push_back(line); 
}
Shravan40
  • 6,849
  • 5
  • 21
  • 43