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; }