如何在 C++ 中逐個讀取檔案中的字元
本文將介紹幾種在 C++ 中如何用 char
逐個讀取文字檔案字元的方法。
使用 ifstream
和 get
方法按字元讀取檔案
用 C++ 的方式處理檔案 I/O 最常見的方法是使用 std::ifstream
。首先,用需要開啟的檔名的引數初始化一個 ifstream
物件。注意,if
語句來驗證檔案的開啟是否成功。接下來,我們使用內建的 get
函式逐個字元的檢索檔案內的文字,並將它們 push_back
在 vector
容器中。最後,我們將向量元素輸出到控制檯進行演示。
#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;
}
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