如何在 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