C 语言标准库中并没有一个叫做 fcreate 的函数。

(图片来源网络,侵删)
你很可能指的是在 DOS/Windows 环境下(Turbo C 2.0 等老旧编译器)使用的 fcreate 函数,这个函数现在已经过时,并且不被现代 C 编译器(如 GCC, Clang, MSVC)所支持。
我将为你介绍两种情况:
- 过时的
fcreate函数(了解即可,不推荐在现代开发中使用)。 - 现代 C 标准中的文件创建方法(强烈推荐,这是目前行业通用的做法)。
过时的 fcreate 函数(DOS/Windows 环境)
fcreate 是一个非标准的 DOS 函数,通常在 <io.h> 或 <fcntl.h> 头文件中声明,它直接返回一个文件句柄,而不是 FILE* 流。
函数原型
int fcreate(const char *filename, int attrib);
参数
filename: 要创建的文件名,可以包含路径。attrib: 文件属性,可以使用一些预定义的宏来设置,FA_NORMAL(0): 普通文件FA_HIDDEN: 隐藏文件FA_SYSTEM: 系统文件FA_RDONLY: 只读文件
返回值
- 成功:返回一个非负的文件句柄(整数)。
- 失败:返回
-1。
使用示例
这个函数创建文件后,你需要使用 write() 或 lseek() 等低级 I/O 函数来操作文件,而不是 fprintf() 或 fscanf()。

(图片来源网络,侵删)
// 注意:此代码只能在支持 fcreate 的老旧编译器(如 Turbo C)上运行
#include <stdio.h> // 用于 perror
#include <io.h> // 用于 fcreate, close
#include <stdlib.h> // 用于 exit
int main() {
const char *filename = "old_style_file.txt";
int file_handle;
// 创建一个普通文件
file_handle = fcreate(filename, FA_NORMAL);
if (file_handle == -1) {
perror("创建文件失败");
exit(EXIT_FAILURE);
}
printf("文件 '%s' 创建成功,文件句柄为: %d\n", filename, file_handle);
// 使用 write 函数写入数据
char *message = "Hello from fcreate!";
int bytes_written = write(file_handle, message, strlen(message));
if (bytes_written == -1) {
perror("写入文件失败");
close(file_handle);
exit(EXIT_FAILURE);
}
printf("成功写入 %d 字节,\n", bytes_written);
// 操作完成后,必须关闭文件句柄
close(file_handle);
return 0;
}
为什么不推荐使用?
- 非标准:不跨平台,在 Linux, macOS 等系统上无法编译。
- 过时:已被现代标准取代。
- 功能有限:它只负责创建,不提供高级的缓冲、格式化 I/O 等功能。
现代 C 标准中的文件创建方法
在现代 C 编程中,我们使用标准 I/O 库 <stdio.h> 中的函数,创建文件主要通过 fopen() 函数实现。
fopen() 函数通过指定的模式来决定如何打开文件,如果文件不存在,并且使用了包含写入权限的模式,fopen() 就会创建这个文件。
fopen() 函数原型
FILE *fopen(const char *filename, const char *mode);
参数
filename: 要打开或创建的文件名。mode: 文件打开模式,这是一个字符串,决定了文件的访问方式。
常用的文件模式
| 模式 | 描述 | 如果文件存在 | 如果文件不存在 | 是否可读 | 是否可写 |
|---|---|---|---|---|---|
"r" |
只读 | 打开失败 | 错误 | 是 | 否 |
"w" |
只写 | 创建新文件 | 否 | 是 | |
"a" |
追加 | ,指针在末尾 | 创建新文件 | 否 | 是 |
"r+" |
读写 | 打开 | 错误 | 是 | 是 |
"w+" |
读写 | 创建新文件 | 是 | 是 | |
"a+" |
读写 | ,指针在末尾 | 创建新文件 | 是 | 是 |
注意:

(图片来源网络,侵删)
"b"可以添加到任何模式后,表示二进制模式(如"wb","rb+"),在 Windows 系统上,文本模式和二进制模式处理换行符有区别,在 Linux/macOS 上则没有区别,为了一致性,推荐在处理非文本文件时使用二进制模式。
使用示例
示例 1:使用 "w" 模式创建并写入文件(会覆盖已存在文件)
这是最常见的创建文件的方式,如果文件已存在,它的内容将被清空。
#include <stdio.h>
#include <stdlib.h> // for exit()
int main() {
const char *filename = "my_new_file.txt";
FILE *fp;
// "w" 模式:如果文件存在则清空,不存在则创建
fp = fopen(filename, "w");
// 检查文件是否成功打开/创建
if (fp == NULL) {
perror("无法创建文件"); // perror 会打印出系统错误信息
return EXIT_FAILURE;
}
// 使用 fprintf 向文件写入格式化数据
fprintf(fp, "你好,世界!\n");
fprintf(fp, "这是使用 C 语言创建的第一个文件,\n");
fprintf(fp, "当前时间是: %s", "2025-10-27");
// 操作完成后,必须关闭文件流
fclose(fp);
printf("文件 '%s' 创建并写入成功!\n", filename);
return 0;
}
示例 2:使用 "a" 模式追加内容到文件(不会覆盖)
如果你想在文件末尾添加内容,而不会删除原有内容,应该使用 "a" 模式。
#include <stdio.h>
#include <stdlib.h>
#include <time.h> // for time()
int main() {
const char *filename = "my_new_file.txt";
FILE *fp;
// "a" 模式:追加模式,如果文件不存在则创建,如果存在则在末尾写入
fp = fopen(filename, "a");
if (fp == NULL) {
perror("无法打开/创建文件进行追加");
return EXIT_FAILURE;
}
// 获取当前时间
time_t rawtime;
time(&rawtime);
char *time_str = ctime(&rawtime);
// 追加一行新内容
fprintf(fp, "\n\n--- 追加日志 ---\n");
fprintf(fp, "这是一条新的追加记录,时间: %s", time_str);
fclose(fp);
printf("内容已成功追加到文件 '%s',\n", filename);
return 0;
}
总结与最佳实践
| 特性 | fcreate (过时) |
fopen (现代标准) |
|---|---|---|
| 所属库 | <io.h> (非标准) |
<stdio.h> (C标准库) |
| 返回值 | 文件句柄 (整数) | 文件指针 (FILE*) |
| 跨平台性 | 差 (仅DOS/Windows) | 优秀 (所有平台) |
| 操作方式 | 低级 I/O (read, write) |
高级 I/O (fprintf, fscanf) |
| 推荐度 | 不推荐 | 强烈推荐 |
核心要点:
- 忘记
fcreate:除非你在维护非常古老的代码,否则请完全不要使用它。 - 拥抱
fopen:在现代 C 语言编程中,所有文件操作都应基于fopen、fclose、fprintf、fscanf等标准 I/O 函数。 - 选择正确的模式:
- 创建新文件并写入:使用
"w",如果文件已存在,它会覆盖。 - 在文件末尾追加内容:使用
"a",如果文件已存在,它会在末尾添加,不会覆盖。 - 读写文件:使用
"r+"(文件必须存在)、"w+"(会覆盖或创建)或"a+"(在末尾读写)。
- 创建新文件并写入:使用
- 始终检查返回值:
fopen可能会失败(磁盘已满或路径无效),所以必须检查返回的FILE*是否为NULL。 - 记得关闭文件:使用
fclose(fp)来释放资源,确保所有缓冲的数据都被写入磁盘。
