To read a file line by line in C++ using std::ifstream, follow these steps with detailed examples:
1. Include Required Headers
#include <iostream>
#include <fstream>
#include <string> // For std::string and std::getline2. Open the File and Check for Success
Use std::ifstream to create a file input stream and check if the file opened successfully:
std::ifstream file("example.txt");
if (!file.is_open()) {
    std::cerr << "Failed to open the file!" << std::endl;
    return 1; // Exit with error code
}3. Read Lines Using std::getline
Loop through the file line by line using std::getline, which reads until the newline (\n):
std::string line;
while (std::getline(file, line)) {
    // Process each line (e.g., print it)
    std::cout << line << '\n';
}4. Close the File (Optional)
The file is automatically closed when the std::ifstream object goes out of scope, but you can explicitly close it:
file.close();Complete Example
#include <iostream>
#include <fstream>
#include <string>
int main() {
    // Step 1: Open the file
    std::ifstream file("example.txt");
    if (!file.is_open()) {
        std::cerr << "Error: Could not open file!" << std::endl;
        return 1;
    }
    // Step 2: Read line by line
    std::string line;
    while (std::getline(file, line)) {
        std::cout << "Line: " << line << '\n';
    }
    // Optional: Check for errors (e.g., premature EOF)
    if (file.bad()) {
        std::cerr << "I/O error occurred!" << std::endl;
    } else if (!file.eof()) {
        std::cerr << "Unexpected end of file!" << std::endl;
    }
    // Step 3: Close the file (automatic if omitted)
    file.close();
    return 0;
}Key Notes
- Handling Empty Lines: std::getlinewill include empty lines (e.g.,line.empty() == true).
- Error Checking: Use file.eof()to check for end-of-file andfile.bad()for I/O errors.
- Line Endings: Works with \n(Unix),\r\n(Windows), and other formats.
- Large Files: Efficiently handles large files since it reads line by line without loading the entire file into memory.
Advanced Use Cases
Example 1: Store Lines in a Vector
#include <vector>
std::vector<std::string> lines;
std::string line;
while (std::getline(file, line)) {
    lines.push_back(line);
}Example 2: Skip Empty Lines
while (std::getline(file, line)) {
    if (!line.empty()) {
        std::cout << line << '\n';
    }
}Example 3: Process Lines Conditionally
int line_number = 1;
while (std::getline(file, line)) {
    if (line.find("error") != std::string::npos) {
        std::cout << "Error found on line " << line_number << ": " << line << '\n';
    }
    line_number++;
}Common Pitfalls
- File Not Found: Always check is_open()before reading.
- Unclosed File: Let the destructor handle closing unless explicitly required.
- Incorrect Paths: Use absolute paths (e.g., "/path/to/file.txt") if the file isn’t in the working directory.
Summary
- Use std::ifstreamandstd::getlinefor line-by-line reading.
- Check for file open errors with is_open().
- Handle edge cases like empty lines or read errors.
- Prefer modern C++ practices (RAII) for resource management.