如何在 C++ 中逐個讀取檔案中的字元

Jinku Hu 2023年1月30日 2020年11月24日
  1. 使用 ifstreamget 方法按字元讀取檔案
  2. 使用 getc 函式按字元讀取檔案
  3. 使用 fgetc 函式按字元讀取檔案
如何在 C++ 中逐個讀取檔案中的字元

本文將介紹幾種在 C++ 中如何用 char 逐個讀取文字檔案字元的方法。

使用 ifstreamget 方法按字元讀取檔案

用 C++ 的方式處理檔案 I/O 最常見的方法是使用 std::ifstream。首先,用需要開啟的檔名的引數初始化一個 ifstream 物件。注意,if 語句來驗證檔案的開啟是否成功。接下來,我們使用內建的 get 函式逐個字元的檢索檔案內的文字,並將它們 push_backvector 容器中。最後,我們將向量元素輸出到控制檯進行演示。

#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<char> bytes;
    char byte = 0;

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

    while (input_file.get(byte)) {
        bytes.push_back(byte);
    }
    for (const auto &i : bytes) {
        cout << i << "-";
    }
    cout << endl;
    input_file.close();

    return EXIT_SUCCESS;
}

使用 getc 函式按字元讀取檔案

另一種按字元讀取檔案的方法是使用 getc 函式,它以 FILE*流作為引數,如果有的話,就讀取下一個字元。接下來,應該對輸入的檔案流進行迭代,直到到達最後一個字元,這就用 feof 函式來實現,檢查是否已經到達檔案的終點。需要注意的是,始終建議在不再需要開啟的檔案流時關閉它們。

#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<char> bytes;

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

    unsigned char character = 0;
    while (!feof(input_file)) {
       character = getc(input_file);
       cout << character << "-";
    }
    cout << endl;
    fclose(input_file);

    return EXIT_SUCCESS;
}

使用 fgetc 函式按字元讀取檔案

fgetc 是前一個函式的替代方法,它實現的功能與 getc 完全相同。在這種情況下,在 if 語句中使用 fgetc 返回值,因為如果達到檔案流的末尾,它就返回 EOF。按照建議,在程式退出之前,我們用 fclose 呼叫關閉檔案流。

#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<char> bytes;

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

    int c;
    while ((c = fgetc(input_file)) != EOF) {
       putchar(c);
       cout << "-";
    }
    cout << endl;
    fclose(input_file);

    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