1、读取文件
要从文件读取,可以使用ifstream
或fstream
类以及文件名。
请注意,我们还将while
循环与getline()
函数(属于ifstream
该类)一起使用,以逐行读取文件并打印文件内容:
// 创建一个文本字符串,用于输出文本文件
string myText;
// 从文本文件读取
ifstream MyReadFile("filename.txt");
// 使用while循环和getline()函数逐行读取文件
while (getline (MyReadFile, myText)) {
// 输出文件中的文本
cout << myText;
}
// 关闭文件
MyReadFile.close();
注意:close()
关闭文件可以清理不必要的内存空间。
文件写入还有其它函数,可以参考下面的文档,
相关函数:C++ File文件处理相关函数
2、获取文件信息
要获取有关文件的更多信息,可以使用int fstat(int fildes, struct stat *buf);函数。
stat文件信息结构体:
struct stat {
dev_t st_dev; /* device */
ino_t st_ino; /* inode */
mode_t st_mode; /* protection */
nlink_t st_nlink; /* number of hard links */
uid_t st_uid; /* user ID of owner */
gid_t st_gid; /* group ID of owner */
dev_t st_rdev; /* device type (if inode device) */
off_t st_size; /* total size, in bytes */
blksize_t st_blksize; /* blocksize for filesystem I/O */
blkcnt_t st_blocks; /* number of blocks allocated */
time_t st_atime; /* time of last access */
time_t st_mtime; /* time of last modification */
time_t st_ctime; /* time of last change */
};
例如,
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
int main ( int argc, char *argv[])
{
struct stat FileAttrib;
if (stat("/etc/passwd", &FileAttrib) < 0)
printf("File Error Message = %s\n", strerror(errno));
else
printf( "Permissions: %d\n", FileAttrib.st_mode );
return 0;
}
3、常见文件读取场景
C++能够灵活高效地处理不同类型的文件读取需求。具体实现可以根据文件类型、内容和性能要求进行优化。
1)读取配置文件
序需要读取键值对配置,如key=value
格式的配置文件。可以使用std::getline()
逐行读取并解析=
分隔的键和值。
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main() {
// 打开配置文件
ifstream infile("config.txt");
// 检查文件是否成功打开
if (!infile) {
cerr << "无法打开文件 config.txt!"
<< endl;
return 1;
}
string line;
// 逐行读取文件
while (getline(infile, line)) {
// 查找 '=' 的位置,分割键和值
size_t pos = line.find('=');
if (pos != string::npos) {
// 获取键和值
string key = line.substr(0, pos);
string value = line.substr(pos + 1);
// 输出键值对
cout << "Key: " << key
<< ", Value: " << value << endl;
}
}
// 关闭文件
infile.close();
return 0;
}
2)读取日志文件
需要分析日志内容,如服务器日志或程序运行记录。对每一行进行模式匹配或数据提取。
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main() {
// 打开文件 log.txt
ifstream infile("log.txt");
// 检查文件是否成功打开
if (!infile) {
cerr << "无法打开文件 log.txt" << endl;
return 1; // 文件打开失败,退出程序
}
std::string line;
// 逐行读取文件
while (getline(infile, line)) {
// 查找是否包含 "ERROR"
if (line.find("ERROR") != string::npos) {
// 输出包含 "ERROR" 的日志行
cout << "Error Log: " << line << endl;
}
}
// 关闭文件
infile.close();
return 0;
}
3)读取CSV文件
读取结构化的表格数据,逗号分隔。使用std::stringstream
进一步分割每一行的字段。
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main() {
// 打开CSV文件
ifstream infile("data.csv");
// 检查文件是否成功打开
if (!infile) {
cerr << "无法打开文件!" << endl;
return 1;
}
string line;
// 逐行读取文件内容
while (getline(infile, line)) {
stringstream ss(line); // 将每行数据放入字符串流
string cell;
// 逐列读取,并用逗号分隔
while (getline(ss, cell, ',')) {
cout << cell << " "; // 输出每个单元格内容
}
cout << endl; // 每行输出后换行
}
infile.close(); // 关闭文件
return 0;
}
4)读取二进制文件
读取文件中存储的二进制数据,如图像或模型文件。使用std::ifstream
的二进制模式打开文件,按字节或块读取到缓冲区。
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
int main() {
// 打开二进制文件
ifstream infile("image.bin", ios::binary);
// 检查文件是否成功打开
if (!infile) {
cerr << "无法打开文件!" << endl;
return 1;
}
// 读取文件内容到缓冲区
vector<char> buffer((istreambuf_iterator
<char>(infile)), istreambuf_iterator<char>());
// 输出每个字节的十六进制表示
cout << "文件内容的十六进制表示:\n";
for (char byte : buffer) {
// 将每个字节转换为十六进制,并输出
cout << hex
<< (unsigned int)(unsigned char)byte << " ";
}
cout << endl;
// 关闭文件
infile.close();
return 0;
}