在 C 和 C++ 中,文件处理是常见的任务之一,包括文件的读取、写入和操作。
1. C 文件处理
C 使用 stdio.h
提供的函数来处理文件操作。
a. 基本步骤
- 打开文件(
fopen
)。 - 读写文件(
fread
、fwrite
、fprintf
、fscanf
、fgetc
、fputc
等)。 - 关闭文件(
fclose
)。
b. 文件打开模式
模式 | 描述 |
---|---|
"r" |
只读模式,文件必须存在。 |
"w" |
写模式,文件存在会清空内容。 |
"a" |
追加模式,写入内容追加到末尾。 |
"r+" |
读写模式,文件必须存在。 |
"w+" |
读写模式,文件存在会清空内容。 |
"a+" |
读写模式,写入内容追加到末尾。 |
c. 文件操作示例
写文件
c
#include <stdio.h>
int main() {
FILE *file = fopen("example.txt", "w");
if (file == NULL) {
perror("Error opending file");
return 1;
}
fprintf(file, "Hello, World!\n");
fclose(file);
return 0;
}
读文件
c
#include <stdio.h>
int main() {
FILE *file = fopen("example.txt", "r");
if (file == NULL) {
perror("Error opening file");
return 1;
}
char line[100];
while (fgets(line, sizeof(line), file)) {
printf("%s", line);
}
fclose(file);
return 0;
}
二进制文件读写
c
#include <stdio.h>
int main() {
FILE *file = fopen("binary.dat", "wb");
if (file == NULL) {
perror("Error opening file");
return 1;
}
int numbers[] = {1, 2, 3, 4, 5};
fwrite(numbers, sizeof(int), 5, file);
fclose(file);
file = fopen("binary.dat", "rb");
if (file == NULL) {
perror("Error opening file");
return 1;
}
int buffer[5];
fread(buffer, sizeof(int), 5, file);
for(int i=0; i<5; i++) {
printf("%d ", buffer[i]);
}
fclose(file);
return 0;
}
2. C++ 文件处理
C++ 使用 fstream
提供高级文件操作功能,头文件为 <fstream>
。
a. 基本步骤
- 创建文件流对象(
std::ifstream
、std::ofstream
、std::fstream
)。 - 打开文件(使用构造函数或
open
方法)。 - 读写文件。
- 关闭文件(自动关闭或显式调用
close
)。
b. 文件流类型
类型 | 描述 |
---|---|
std::ifstream |
输入文件流,用于读文件。 |
std::ofstream |
输出文件流,用于写文件。 |
std::fstream |
通用文件流,读写文件。 |
c. 文件操作示例
写文件
cpp
#include <fstream>
#include <iostream>
int main() {
std::ofstream file("example.txt");
if(!file) {
std::cerr << "Error opening file" << std::endl;
return 1;
}
file << "Hello, C++ World!" << std::endl;
file.close();
return 0;
}
读文件
cpp
#include <fstream>
#include <iostream>
#include <string>
int main() {
std::ifstream file("example.txt");
if(!file) {
std::cerr << "Error opening file" << std::endl;
return 1;
}
std::string line;
while (std::getline(file, line)) {
std::cout << line << std::endl;
}
file.close();
return 0;
}
二进制文件读写
cpp
#include <fstream>
#include <iostream>
int main() {
std::ofstream file("binary.dat", std::ios::binary);
if (!file) {
std::cerr << "Error opening file" << std::endl;
return 1;
}
int numbers[] = {1, 2, 3, 4, 5};
file.write(reinterpret_cast<char *>(numbers), sizeof(numbers));
file.close();
std::ifstream infile("binary.dat", std::ios::binary);
if (!infile) {
std::cerr << "Error opening file" << std::endl;
return 1;
}
int buffer[5];
infile.read(reinterpret_cast<char*>(buffer), sizeof(buffer));
for(int n : buffer) {
std::cout << n << " ";
}
infile.close();
return 0;
}
3. 常见操作和注意事项
a. 文件指针
- C 提供
ftell
、fseek
操作文件指针:
c
fseek(file, 0, SEEK_END); // 移动到文件末尾
long size = ftell(file); // 获取文件大小
- C++ 使用
seekg
、seekp
:
cpp
file.seekg(0, std::ios::end); // 读指针移动到末尾
std::streampos size = file.tellg(); // 获取文件大小
b. 文件状态检查
- C 中可以用
ferror
检查错误。 - C++ 提供流状态检查:
cpp
if (file.fail()) {
std::cerr << "Error occurred!" << std::endl;
}
c. 异常安全
C++ 文件流可以与异常处理结合使用:
cpp
#include <fstream>
#include <iostream>
#include <stdexcept>
int main() {
try {
std::ifstream file("example.txt");
if (!file) {
throw std::runtime_error("Error opening file");
}
std::string content;
while (std::getline(file, content)) {
std::cout << content << std::endl;
}
} catch (const std::exception& e) {
std::cerr << e.what() << std::endl;
}
return 0;
}
通过熟练掌握 C/C++ 文件处理技术,可以高效地完成各种文件操作。C 提供了基础功能,而 C++ 则提供了更安全和高级的文件流操作,适合复杂的应用场景。