C语言中fcreate函数如何正确使用?

99ANYc3cd6
预计阅读时长 17 分钟
位置: 首页 C语言 正文

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

c语言 fcreate
(图片来源网络,侵删)

你很可能指的是在 DOS/Windows 环境下(Turbo C 2.0 等老旧编译器)使用的 fcreate 函数,这个函数现在已经过时,并且不被现代 C 编译器(如 GCC, Clang, MSVC)所支持。

我将为你介绍两种情况:

  1. 过时的 fcreate 函数(了解即可,不推荐在现代开发中使用)。
  2. 现代 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()

c语言 fcreate
(图片来源网络,侵删)
// 注意:此代码只能在支持 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+" 读写 ,指针在末尾 创建新文件

注意:

c语言 fcreate
(图片来源网络,侵删)
  • "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)
推荐度 不推荐 强烈推荐

核心要点:

  1. 忘记 fcreate:除非你在维护非常古老的代码,否则请完全不要使用它。
  2. 拥抱 fopen:在现代 C 语言编程中,所有文件操作都应基于 fopenfclosefprintffscanf 等标准 I/O 函数。
  3. 选择正确的模式
    • 创建新文件并写入:使用 "w",如果文件已存在,它会覆盖
    • 在文件末尾追加内容:使用 "a",如果文件已存在,它会在末尾添加,不会覆盖。
    • 读写文件:使用 "r+"(文件必须存在)、"w+"(会覆盖或创建)或 "a+"(在末尾读写)。
  4. 始终检查返回值fopen 可能会失败(磁盘已满或路径无效),所以必须检查返回的 FILE* 是否为 NULL
  5. 记得关闭文件:使用 fclose(fp) 来释放资源,确保所有缓冲的数据都被写入磁盘。
-- 展开阅读全文 --
头像
C语言getline如何正确使用?
« 上一篇 04-12
C语言libyaml如何解析YAML文件?
下一篇 » 04-12

相关文章

取消
微信二维码
支付宝二维码

目录[+]