fstream 是 C++ 标准库的一部分,用于文件输入输出操作,C 语言处理文件的方式与 C++ 完全不同,它使用一组在 <stdio.h> (在 C99 及以后版本中,也写作 <cstdio>) 中定义的函数。

如果您想在 C 语言中进行文件操作,您应该使用 C 标准库提供的函数,下面我将详细介绍 C 语言的文件操作方法,并与 C++ 的 fstream 进行对比,以帮助您更好地理解。
C 语言的文件操作 (使用 <stdio.h>)
C 语言将文件视为一个字符流或字节流,通过一个指向 FILE 结构体的指针来操作文件,这个指针通常被称为“文件指针”。
核心步骤
- 包含头文件:
#include <stdio.h> - 打开文件: 使用
fopen()函数,它会返回一个FILE*指针,如果打开失败,则返回NULL。 - 读写文件: 使用一系列函数(如
fprintf,fscanf,fread,fwrite,fgets,fputs等)进行操作。 - 关闭文件: 使用
fclose()函数,释放与文件相关的资源。
主要函数详解
打开和关闭文件
-
FILE *fopen(const char *filename, const char *mode)filename: 文件名。mode: 打开模式,常见的有:"r": 只读,文件必须存在。"w": 只写,如果文件存在则清空,如果不存在则创建。"a": 追加,如果文件存在则在末尾写入,如果不存在则创建。"r+": 读写,文件必须存在。"w+": 读写,如果文件存在则清空,如果不存在则创建。"a+": 读写,在末尾追加读取。
- 示例:
FILE *fp; fp = fopen("mydata.txt", "w"); // 以只写模式打开文件,准备写入 if (fp == NULL) { perror("Error opening file"); return 1; // 打开失败,退出程序 }
-
int fclose(FILE *stream)- 关闭文件指针
stream指向的文件,并刷新缓冲区。 - 示例:
fclose(fp);
- 关闭文件指针
格式化读写 (类似 printf 和 scanf)
-
int fprintf(FILE *stream, const char *format, ...)- 将格式化后的数据写入到文件流
stream中。 - 示例:
int age = 25; char name[] = "Alice"; fprintf(fp, "Name: %s, Age: %d\n", name, age);
- 将格式化后的数据写入到文件流
-
int fscanf(FILE *stream, const char *format, ...)- 从文件流
stream中读取格式化数据。 - 示例:
char read_name[50]; int read_age; // 假设文件指针 fp 已经指向一个包含 "Name: Alice, Age: 25" 的文件 fscanf(fp, "Name: %s, Age: %d", read_name, &read_age);
- 从文件流
字符/字符串读写
-
int fgetc(FILE *stream)从文件流中读取一个字符。
-
int fputc(int character, FILE *stream)将一个字符写入文件流。
-
char *fgets(char *str, int n, FILE *stream)- 从文件流中读取一行(最多
n-1个字符)到str中。
- 从文件流中读取一行(最多
-
int fputs(const char *str, FILE *stream)- 将字符串
str写入文件流。
- 将字符串
二进制读写 (直接读写内存块)
-
size_t fread(void *ptr, size_t size, size_t count, FILE *stream)- 从文件流中读取
count个大小为size的数据块到ptr指向的内存区域。
- 从文件流中读取
-
size_t fwrite(const void *ptr, size_t size, size_t count, FILE *stream)- 从
ptr指向的内存区域,将count个大小为size的数据块写入文件流。
- 从
C++ 的 fstream (作为对比)
为了更清晰地展示区别,这里简单介绍一下 C++ 的 fstream。
C++ 的 fstream 是基于面向对象设计的,它将文件操作封装在三个类中:
std::ifstream: 输入文件流,用于读取文件。std::ofstream: 输出文件流,用于写入文件。std::fstream: 双向文件流,用于读写文件。
C++ fstream 示例
#include <iostream>
#include <fstream> // C++ 的 fstream 头文件
#include <string>
int main() {
// 写入文件
std::ofstream out_file("mydata_cpp.txt"); // 创建一个 ofstream 对象
if (out_file.is_open()) {
out_file << "Hello from C++!" << std::endl;
out_file << "Name: Bob, Age: 30" << std::endl;
out_file.close();
} else {
std::cerr << "Unable to open file for writing" << std::endl;
}
// 读取文件
std::ifstream in_file("mydata_cpp.txt"); // 创建一个 ifstream 对象
if (in_file.is_open()) {
std::string line;
while (std::getline(in_file, line)) { // 使用 getline 逐行读取
std::cout << line << std::endl;
}
in_file.close();
} else {
std::cerr << "Unable to open file for reading" << std::endl;
}
return 0;
}
C 与 C++ 文件操作对比总结
| 特性 | C 语言 (<stdio.h>) |
C++ (<fstream>) |
|---|---|---|
| 核心概念 | 文件指针 (FILE*),函数式接口 |
流对象 (ifstream, ofstream),面向对象 |
| 打开文件 | fopen("filename", "mode") |
std::ofstream out_file("filename"); |
| 关闭文件 | fclose(FILE*) |
out_file.close(); (析构函数也会自动关闭) |
| 错误检查 | 检查 fopen 返回值是否为 NULL |
使用 is_open() 成员函数或 运算符 (如 if (!out_file)) |
| 写入数据 | fprintf(fp, "..."), fwrite(...) |
out_file << "...", out_file.write(...) |
| 读取数据 | fscanf(fp, "..."), fread(...) |
in_file >> ..., in_file.read(...) |
| 优点 | 简单、高效、底层、C/C++ 兼容性好 | 类型安全、可扩展性强(如与标准流 cin/cout 类似)、更安全(RAII) |
| 缺点 | 容易出错(如忘记关闭文件)、类型不安全 | 相对复杂一些、仅限 C++ |
- 如果您正在编写 C 语言程序,请务必使用
<stdio.h>中的函数,如fopen,fclose,fprintf,fscanf等。C 语言中没有fstream。 - 如果您正在编写 C++ 程序,则强烈推荐使用
<fstream>库,因为它更安全、更符合现代 C++ 的编程风格(RAII - 资源获取即初始化)。
希望这个解释能帮助您澄清困惑!
