如何在 C++ 中逐行讀取檔案

Jinku Hu 2023年1月30日 2020年10月17日
  1. 使用 std::getline() 函式逐行讀取檔案
  2. 使用 C 庫的 getline() 函式逐行讀取一個檔案
如何在 C++ 中逐行讀取檔案

本文將介紹如何在 C++ 中逐行讀取檔案。

使用 std::getline() 函式逐行讀取檔案

getline() 函式是 C++ 中逐行讀取檔案的首選方式。該函式從輸入流中讀取字元,直到遇到定界符 char,然後將它們儲存在一個字串中。定界符作為第三個可選引數傳遞,預設情況下,它被認為是一個新的行字元/n

由於 getline 方法在資料可以從流中讀取的情況下會返回非零值,所以我們可以把它作為一個 while 迴圈條件,繼續從檔案中檢索行,直到到達檔案的終點。需要注意的是,最好用 is_open 方法驗證輸入流是否有關聯的檔案。

#include <iostream>
#include <fstream>
#include <vector>

using std::cout; using std::cerr;
using std::endl; using std::string;
using std::ifstream; using std::vector;

int main()
{
    string filename("input.txt");
    vector<string> lines;
    string line;

    ifstream input_file(filename);
    if (!input_file.is_open()) {
        cerr << "Could not open the file - '"
             << filename << "'" << endl;
        return EXIT_FAILURE;
    }

    while (getline(input_file, line)){
        lines.push_back(line);
    }

    for (const auto &i : lines)
        cout << i << endl;

    input_file.close();
    return EXIT_SUCCESS;
}

使用 C 庫的 getline() 函式逐行讀取一個檔案

getline 函式的使用方法類似於逐行迴圈瀏覽檔案,並將提取的行儲存在字串變數中。主要的區別是,我們應該使用 fopen 函式開啟一個檔案流,該函式返回 FILE*物件,隨後作為第三個引數傳遞。

注意,getline 函式儲存在 char 指標,它被設定為 nullptr。這是有效的,因為函式本身是為檢索字元動態分配記憶體的。因此,即使 getline 呼叫失敗,char 指標也應該被程式設計師明確釋放。

另外,在呼叫函式之前,將型別為 size_t 的第二個引數設定為 0 也很重要。你可以在這裡看到 getline 函式的詳細手冊

#include <iostream>
#include <vector>

using std::cout; using std::cerr;
using std::endl; using std::string;
using std::vector;

int main()
{
    string filename("input.txt");
    vector<string> lines;
    char* c_line = nullptr;
    size_t len = 0;

    FILE* input_file = fopen(filename.c_str(), "r");
    if (input_file == nullptr)
        return EXIT_FAILURE;

    while ((getline(&c_line, &len, input_file)) != -1) {
        lines.push_back(line.assign(c_line));
    }
    for (const auto &i : lines) {
        cout << i;
    }
    cout << endl;
    fclose(input_file);
    free(c_line);

    return EXIT_SUCCESS;
}
Author: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn

相關文章 - C++ File