In this article we will discuss how to read a file line by line and put them in a vector or perform some other operation each line.
Reading File line by line
First open the file i.e.
// Open the File std::ifstream in("file.txt");
Now keep reading next line using getline() and push it in vector function until end of file i.e.
std::string str; // Read the next line from File untill it reaches the end. while (std::getline(in, str)) { // Line contains string of length > 0 then save it in vector if(str.size() > 0) vecOfStrs.push_back(str); }
Complete example is as follows:
#include <iostream> #include <fstream> #include <string> #include <vector> /* * It will iterate through all the lines in file and * put them in given vector */ bool getFileContent(std::string fileName, std::vector<std::string> & vecOfStrs) { // Open the File std::ifstream in(fileName.c_str()); // Check if object is valid if(!in) { std::cerr << "Cannot open the File : "<<fileName<<std::endl; return false; } std::string str; // Read the next line from File untill it reaches the end. while (std::getline(in, str)) { // Line contains string of length > 0 then save it in vector if(str.size() > 0) vecOfStrs.push_back(str); } //Close The File in.close(); return true; } int main() { std::vector<std::string> vecOfStr; // Get the contents of file in a vector bool result = getFileContent("example.cpp", vecOfStr); if(result) { // Print the vector contents for(std::string & line : vecOfStr) std::cout<<line<<std::endl; } }
Reading file line by line and performing operations on each line
Many times we encounter scenarios where we need to read a file line by line and perform some operation on each line like,
- Search something in each line.
- Modify the content
- Store the string to some container etc.
We can a make a generic function that will accept a callback or function pointer along with File name i.e.
Frequently Asked:
/* * It will iterate through all the lines in file and * call the given callback on each line. */ bool iterateFile(std::string fileName, std::function<void (const std::string & )> callback)
It will read the file line by line and will call the given function on each line.
Checkout complete example as follows,
Pointers in C/C++ [Full Course]
#include <iostream> #include <fstream> #include <string> #include <vector> #include <functional> /* * It will iterate through all the lines in file and * call the given callback on each line. */ bool iterateFile(std::string fileName, std::function<void (const std::string & )> callback) { // Open the File std::ifstream in(fileName.c_str()); // Check if object is valid if(!in) { std::cerr << "Cannot open the File : "<<fileName<<std::endl; return false; } std::string str; // Read the next line from File untill it reaches the end. while (std::getline(in, str)) { // Call the given callback callback(str); } //Close The File in.close(); return true; } int main() { std::vector<std::string> vecOfStr; //Call given lambda function for each line in file bool res = iterateFile("example.cpp", [&](const std::string & str){ // Add to vector vecOfStr.push_back(str); }); if(res) { for(std::string & line : vecOfStr) std::cout<<line<<std::endl; } }
To compile the above examples use following command on linux,
g++ –std=c++11 example.cpp