C++ 提供了多种方式来读取文件,常见的文件读取场景包括读取配置文件、日志文件、CSV文件、二进制文件等。文件处理的基本包括打开文件、读取内容、检查文件状态和关闭文件。本文主要介绍C++ File文件处理 读文件。

1、读取文件

要从文件读取,可以使用ifstreamfstream 类以及文件名。

请注意,我们还将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;
}

推荐文档

相关文档

大家感兴趣的内容

随机列表