📅  最后修改于: 2023-12-03 15:10:59.696000             🧑  作者: Mango
作为程序员,文件处理是必不可少的任务。本文将介绍四个文件处理技巧,帮助 C/C++ 程序员更快更轻松地处理文件。
RAII 技术是 C++ 中的一个重要特性,能够自动管理资源。在文件处理中,可以使用 RAII 技术来自动关闭文件,避免资源泄漏。
#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 文件读写不支持 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;
}
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++ 文档。
在 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 是一个跨平台的 C++ 库,为程序员提供了一系列优秀的工具。其中,boost::filesystem 和 boost::iostreams 库尤为重要,可以方便地进行文件读写和处理。
#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;
}
#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++ 程序员都应该知道的四个文件处理技巧。不同的技巧可以针对不同的需求进行选择。要成为一名优秀的程序员,灵活运用这些技巧是必不可少的。