📌  相关文章
📜  每个C C++程序员都应该知道的四个文件处理技巧(1)

📅  最后修改于: 2023-12-03 15:10:59.696000             🧑  作者: Mango

每个 C/C++ 程序员都应该知道的四个文件处理技巧

作为程序员,文件处理是必不可少的任务。本文将介绍四个文件处理技巧,帮助 C/C++ 程序员更快更轻松地处理文件。

技巧一:使用 RAII(资源获取即初始化)技术

RAII 技术是 C++ 中的一个重要特性,能够自动管理资源。在文件处理中,可以使用 RAII 技术来自动关闭文件,避免资源泄漏。

C++ 文件读写示例
#include <fstream>
#include <iostream>

int main() {
    std::ifstream in_file("input.txt");
    if (!in_file) {
        std::cerr << "Error: cannot open input file\n";
        return 1;
    }

    std::ofstream out_file("output.txt");
    if (!out_file) {
        std::cerr << "Error: cannot open output file\n";
        return 1;
    }

    std::string line;
    while (std::getline(in_file, line)) {
        out_file << line << '\n';
    }

    return 0;
}

通过使用 RAII,这个例子中的文件流实例会在函数结束时自动关闭。

C 文件读写示例

C 文件读写不支持 RAII,需要手动关闭文件。

#include <stdio.h>

int main() {
    FILE* in_file = fopen("input.txt", "r");
    if (!in_file) {
        fprintf(stderr, "Error: cannot open input file\n");
        return 1;
    }

    FILE* out_file = fopen("output.txt", "w");
    if (!out_file) {
        fprintf(stderr, "Error: cannot open output file\n");
        return 1;
    }

    char line[256];
    while (fgets(line, 256, in_file)) {
        fprintf(out_file, "%s", line);
    }

    fclose(in_file);
    fclose(out_file);

    return 0;
}
技巧二:使用 std::filesystem 库

C++17 中引入了 std::filesystem 库,提供了一套现代化的文件处理 API,能够更加方便地进行文件操作。

检查文件是否存在
#include <filesystem>
#include <iostream>

int main() {
    std::filesystem::path file_path = "input.txt";
    if (std::filesystem::exists(file_path)) {  // 检查文件是否存在
        std::cout << "File exists\n";
    } else {
        std::cout << "File does not exist\n";
    }

    return 0;
}
遍历目录
#include <filesystem>
#include <iostream>

int main() {
    std::filesystem::path dir_path = ".";
    for (const auto& entry : std::filesystem::directory_iterator(dir_path)) {
        std::cout << entry.path() << '\n';  // 输出每个文件的路径
    }

    return 0;
}

更多 std::filesystem 库的用法,请参考 C++ 文档。

技巧三:使用 mmap 系统调用

在 Linux/Unix 系统中,可以通过 mmap 系统调用将文件映射到内存中,实现快速访问文件的目的。

#include <fcntl.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <unistd.h>

#include <iostream>

int main() {
    int fd = open("input.txt", O_RDONLY);
    if (fd == -1) {
        std::cerr << "Error: cannot open file\n";
        return 1;
    }

    struct stat sb;
    if (fstat(fd, &sb) == -1) {
        std::cerr << "Error: cannot get stat for file\n";
        return 1;
    }

    char* file_data = static_cast<char*>(mmap(nullptr, sb.st_size, PROT_READ, MAP_PRIVATE, fd, 0));
    if (file_data == MAP_FAILED) {
        std::cerr << "Error: mmap failed\n";
        return 1;
    }

    // 访问文件数据,例如输出文件内容
    std::cout << file_data;

    if (munmap(file_data, sb.st_size) == -1) {
        std::cerr << "Error: munmap failed\n";
        return 1;
    }

    close(fd);

    return 0;
}
技巧四:使用 boost 库进行文件操作

Boost 是一个跨平台的 C++ 库,为程序员提供了一系列优秀的工具。其中,boost::filesystem 和 boost::iostreams 库尤为重要,可以方便地进行文件读写和处理。

boost::filesystem 库示例
#include <boost/filesystem.hpp>
#include <iostream>

int main() {
    boost::filesystem::path file_path = "input.txt";
    if (boost::filesystem::exists(file_path)) {
        std::cout << "File exists\n";
    } else {
        std::cout << "File does not exist\n";
    }

    return 0;
}
boost::iostreams 库示例
#include <boost/iostreams/device/file.hpp>
#include <boost/iostreams/stream.hpp>
#include <iostream>

int main() {
    boost::iostreams::stream<boost::iostreams::file_source> in("input.txt");
    if (!in) {
        std::cerr << "Error: cannot open input file\n";
        return 1;
    }

    boost::iostreams::stream<boost::iostreams::file_sink> out("output.txt");
    if (!out) {
        std::cerr << "Error: cannot open output file\n";
        return 1;
    }

    std::string line;
    while (std::getline(in, line)) {
        out << line << '\n';
    }

    return 0;
}

Boost 库提供了丰富的接口和函数,可以大大简化文件处理代码的编写。

以上就是每个 C/C++ 程序员都应该知道的四个文件处理技巧。不同的技巧可以针对不同的需求进行选择。要成为一名优秀的程序员,灵活运用这些技巧是必不可少的。