Never carry over reading from a stream with the following loop:
while ( !ifs.eof() )
On some websites you will find an example that you should do:
while ( ifs.good() )
which is slightly better than the first cycle, but still it is quite error prone and not recommended. Look at: Why is iostream :: eof inside a loop condition considered wrong?
The most common ways to read files are either using std::getline when reading line by line:
std::string line; while ( std::getline(ifs, line) ) { if (line.empty())
or simply using the >> operator when reading in words or extracting specific types (e.g. numbers):
std::string word; while ( ifs >> word ) { ... }
And to your dynamically allocated C-style array of std::string objects: avoid dynamic allocation as much as possible. Believe me, you do not want to take care of managing your memory on your own. Prefer to use objects with automatic storage time. Take advantage of the standard library. As already stated: use STL containers like std::vector instead of C-style arrays:
std::ifstream ifs(path); std::vector<std::string> lines; std::string line; while ( std::getline(ifs, line) ) {
source share