【C语言】文件操作函数详解

简介: C语言提供了一组标准库函数来处理文件操作,这些函数定义在 `<stdio.h>` 头文件中。文件操作包括文件的打开、读写、关闭以及文件属性的查询等。以下是常用文件操作函数的详细讲解,包括函数原型、参数说明、返回值说明、示例代码和表格汇总。

C语言文件操作函数详解

C语言提供了一组标准库函数来处理文件操作,这些函数定义在 <stdio.h> 头文件中。文件操作包括文件的打开、读写、关闭以及文件属性的查询等。以下是常用文件操作函数的详细讲解,包括函数原型、参数说明、返回值说明、示例代码和表格汇总。

表格汇总

函数 作用 示例 输出
fopen 打开文件 fopen("file.txt", "r") 文件指针
fclose 关闭文件 fclose(file) 返回 0EOF
fread 从文件中读取数据 fread(buffer, size, count, file) 读取的数据
fwrite 将数据写入文件 fwrite(buffer, size, count, file) 写入的数据
fseek 设置文件位置指针 fseek(file, offset, origin) 返回 0EOF
ftell 获取文件位置指针 ftell(file) 文件位置
rewind 重置文件位置指针到文件开头 rewind(file) 无返回值
fprintf 格式化输出到文件 fprintf(file, "data: %d", value) 格式化的字符串
fscanf 从文件中格式化输入 fscanf(file, "%d", &value) 读取的值
feof 检查文件是否到达文件末尾 feof(file) 返回非零值或 0
ferror 检查文件操作是否发生错误 ferror(file) 错误代码
clearerr 清除文件流的错误和EOF标志 clearerr(file) 无返回值

1. fopen

函数原型:

FILE *fopen(const char *filename, const char *mode);

参数说明:

  • filename: 要打开的文件的路径。
  • mode: 文件打开模式,如 "r"(只读)、"w"(只写)、"a"(追加)等。

返回值说明:

  • 成功时,返回指向 FILE 类型的文件指针;失败时,返回 NULL

示例代码:

#include <stdio.h>

int main() {
   
    FILE *file;

    file = fopen("example.txt", "w");
    if (file == NULL) {
   
        perror("无法打开文件");
        return 1;
    }

    fprintf(file, "Hello, World!\n");
    fclose(file);

    return 0;
}

表格说明:

函数 作用 示例 输出
fopen 打开文件 fopen("example.txt", "w") 文件指针或 NULL

2. fclose

函数原型:

int fclose(FILE *stream);

参数说明:

  • stream: 要关闭的文件指针。

返回值说明:

  • 成功时,返回 0;失败时,返回 EOF

示例代码:

#include <stdio.h>

int main() {
   
    FILE *file;

    file = fopen("example.txt", "w");
    if (file == NULL) {
   
        perror("无法打开文件");
        return 1;
    }

    fprintf(file, "Hello, World!\n");
    if (fclose(file) != 0) {
   
        perror("无法关闭文件");
        return 1;
    }

    return 0;
}

表格说明:

函数 作用 示例 输出
fclose 关闭文件 fclose(file) 0EOF

3. fread

函数原型:

size_t fread(void *ptr, size_t size, size_t count, FILE *stream);

参数说明:

  • ptr: 指向存储读取数据的内存块的指针。
  • size: 每个元素的字节数。
  • count: 要读取的元素数量。
  • stream: 文件指针。

返回值说明:

  • 返回成功读取的元素数量。如果返回值小于 count,可能发生了文件结束或读取错误。

示例代码:

#include <stdio.h>

int main() {
   
    FILE *file;
    char buffer[20];
    size_t bytesRead;

    file = fopen("example.txt", "r");
    if (file == NULL) {
   
        perror("无法打开文件");
        return 1;
    }

    bytesRead = fread(buffer, sizeof(char), sizeof(buffer) - 1, file);
    buffer[bytesRead] = '\0'; // 确保字符串结束符
    printf("读取数据: %s\n", buffer);

    fclose(file);

    return 0;
}

表格说明:

函数 作用 示例 输出
fread 从文件中读取数据 fread(buffer, size, count, file) 读取的数据

4. fwrite

函数原型:

size_t fwrite(const void *ptr, size_t size, size_t count, FILE *stream);

参数说明:

  • ptr: 指向要写入文件的内存块的指针。
  • size: 每个元素的字节数。
  • count: 要写入的元素数量。
  • stream: 文件指针。

返回值说明:

  • 返回成功写入的元素数量。如果返回值小于 count,可能发生了写入错误。

示例代码:

#include <stdio.h>

int main() {
   
    FILE *file;
    const char *text = "Hello, File Writing!";

    file = fopen("example.txt", "w");
    if (file == NULL) {
   
        perror("无法打开文件");
        return 1;
    }

    if (fwrite(text, sizeof(char), strlen(text), file) < strlen(text)) {
   
        perror("写入文件失败");
        fclose(file);
        return 1;
    }

    fclose(file);

    return 0;
}

表格说明:

函数 作用 示例 输出
fwrite 将数据写入文件 fwrite(buffer, size, count, file) 写入的数据

5. fseek

函数原型:

int fseek(FILE *stream, long offset, int whence);

参数说明:

  • stream: 文件指针。
  • offset: 从 whence 指定的位置偏移的字节数。
  • whence: 指定偏移的起始位置,可以是 SEEK_SET(文件开头)、SEEK_CUR(当前位置)、SEEK_END(文件末尾)。

返回值说明:

  • 成功时返回 0;失败时返回 -1

示例代码:

#include <stdio.h>

int main() {
   
    FILE *file;
    long position;

    file = fopen("example.txt", "r");
    if (file == NULL) {
   
        perror("无法打开文件");
        return 1;
    }

    fseek(file, 5, SEEK_SET);  // 从文件开头偏移5个字节
    position = ftell(file);    // 获取当前文件位置
    printf("文件位置: %ld\n", position); // 输出: 文件位置: 5

    fclose(file);

    return 0;
}

表格说明:

函数 作用 示例 输出
fseek 设置文件位置指针 fseek(file, offset, whence) 成功时 0-1

6. ftell

函数原型:

long ftell(FILE *stream);

参数说明:

  • stream: 文件指针,指向一个已打开的文件。

返回值说明:

  • 返回从文件开头到当前位置的字节数。成功时返回当前文件位置的偏移量,失败时返回 -1L

示例代码:

#include <stdio.h>

int main() {
   
    FILE *file;
    long position;

    file = fopen("example.txt", "r");
    if (file == NULL) {
   
        perror("无法打开文件");
        return 1;
    }

    fseek(file, 10, SEEK_SET); // 从文件开头偏移10个字节
    position = ftell(file);    // 获取当前文件位置
    printf("文件当前位置: %ld\n", position); // 输出: 文件当前位置: 10

    fclose(file);

    return 0;
}

表格说明:

函数 作用 示例 输出
ftell 获取文件当前位置 ftell(file) 文件当前位置: 10

7. rewind

函数原型:

void rewind(FILE *stream);

参数说明:

  • stream: 文件指针,指向一个已打开的文件。

返回值说明:

  • 无返回值。此函数将文件位置指针重置到文件的开头。

示例代码:

#include <stdio.h>

int main() {
   
    FILE *file;
    char buffer[50];

    file = fopen("example.txt", "r");
    if (file == NULL) {
   
        perror("无法打开文件");
        return 1;
    }

    fread(buffer, sizeof(char), sizeof(buffer) - 1, file); // 读取文件数据
    buffer[sizeof(buffer) - 1] = '\0'; // 确保字符串结束符

    rewind(file); // 重置文件指针到开头
    fread(buffer, sizeof(char), sizeof(buffer) - 1, file); // 重新读取文件数据
    buffer[sizeof(buffer) - 1] = '\0'; // 确保字符串结束符

    printf("重新读取的数据: %s\n", buffer); // 输出重新读取的数据

    fclose(file);

    return 0;
}

表格说明:

函数 作用 示例 输出
rewind 重置文件指针到文件开头 rewind(file) 无输出(重置指针)

8. fprintf

函数原型:

int fprintf(FILE *stream, const char *format, ...);

参数说明:

  • stream: 文件指针,指向一个已打开的文件。
  • format: 格式字符串,用于指定输出格式。
  • ...: 其他格式化数据,根据 format 中的占位符提供。

返回值说明:

  • 成功时,返回输出的字符总数;失败时返回 EOF

示例代码:

#include <stdio.h>

int main() {
   
    FILE *file;
    int number = 42;

    file = fopen("example.txt", "w");
    if (file == NULL) {
   
        perror("无法打开文件");
        return 1;
    }

    if (fprintf(file, "The answer is %d\n", number) < 0) {
   
        perror("写入文件失败");
        fclose(file);
        return 1;
    }

    fclose(file);

    return 0;
}

表格说明:

函数 作用 示例 输出
fprintf 格式化输出到文件 fprintf(file, "data: %d", value) 格式化的字符串

9. fscanf

函数原型:

int fscanf(FILE *stream, const char *format, ...);

参数说明:

  • stream: 文件指针,指向一个已打开的文件。
  • format: 格式字符串,用于指定输入格式。
  • ...: 其他格式化输入,根据 format 中的占位符提供。

返回值说明:

  • 成功时,返回成功匹配和赋值的项目数;失败时返回 EOF

示例代码:

#include <stdio.h>

int main() {
   
    FILE *file;
    int number;

    file = fopen("example.txt", "r");
    if (file == NULL) {
   
        perror("无法打开文件");
        return 1;
    }

    if (fscanf(file, "The answer is %d", &number) != 1) {
   
        perror("读取文件失败");
        fclose(file);
        return 1;
    }

    printf("读取的数字: %d\n", number);

    fclose(file);

    return 0;
}

表格说明:

函数 作用 示例 输出
fscanf 从文件中格式化输入 fscanf(file, "%d", &value) 读取的值

10. feof

函数原型:

int feof(FILE *stream);

参数说明:

  • stream: 文件指针,指向一个已打开的文件。

返回值说明:

  • 如果到达文件末尾,返回非零值;否则返回 0

示例代码:

#include <stdio.h>

int main() {
   
    FILE *file;
    char buffer[20];

    file = fopen("example.txt", "r");
    if (file == NULL) {
   
        perror("无法打开文件");
        return 1;
    }

    while (fread(buffer, sizeof(char), sizeof(buffer) - 1, file) > 0) {
   
        buffer[sizeof(buffer) - 1] = '\0';
        printf("读取的数据: %s\n", buffer);
    }

    if (feof(file)) {
   
        printf("到达文件末尾\n");
    } else {
   
        printf("文件读取错误\n");
    }

    fclose(file);

    return 0;
}

表格说明:

函数 作用 示例 输出
feof 检查文件是否到达文件末尾 feof(file) 到达文件末尾

11. ferror

函数原型:

int ferror(FILE *stream);

参数说明:

  • stream: 文件指针,指向一个已打开的文件。

返回值说明:

  • 返回非零值表示发生了错误;返回 0 表示没有错误。

示例代码:

#include <stdio.h>

int main() {
   
    FILE *file;
    char buffer[20];

    file = fopen("example.txt", "r");
    if (file == NULL) {
   
        perror("无法打开文件");
        return 1;
    }

    if (fread(buffer, sizeof(char), sizeof(buffer) - 1, file) < 0) {
   
        if (ferror(file)) {
   
            perror("读取文件错误");
        }
        fclose(file);
        return 1;
    }

    fclose(file);

    return 0;
}

表格说明:

函数 作用 示例 输出
ferror 检查文件操作是否发生错误 ferror(file) 错误代码

12. clearerr

函数原型:

void clearerr(FILE *stream);

参数说明:

  • stream: 文件指针,指向一个已打开的文件。

返回值说明:

  • 无返回值。此函数清除流的错误标志和EOF标志。

示例代码:

#include <stdio.h>

int main() {
   
    FILE *file;
    char buffer[10];

    file = fopen("example.txt", "r");
    if (file == NULL) {
   
        perror("无法打开文件");
        return 1;
    }

    fread(buffer, sizeof(char), sizeof(buffer) - 1, file); // 模拟读取
    if (ferror(file)) {
   
        printf("读取文件时发生错误\n");
        clearerr(file); // 清除错误标志
    }

    // 继续操作文件

    fclose(file);

    return 0;
}

表格说明:

函数 作用 示例 输出
clearerr 清除文件流的错误和EOF标志 clearerr(file) 无输出(清除标志)

13. 总结

C语言的文件操作函数提供了一系列用于处理文件的工具,包括打开、关闭、读写、定位文件指针以及检查文件状态等。这些函数为程序员提供了灵活的文件管理能力,从简单的文件读写到复杂的文件处理任务,都可以通过这些标准库函数来实现。掌握这些函数的使用对于编写健壮且可靠的C程序至关重要。

14. 附录:函数参考表

函数 作用 示例 返回值
fopen 打开文件 fopen("file.txt", "r") 文件指针或 NULL
fclose 关闭文件 fclose(file) 0EOF
fread 从文件中读取数据 fread(buffer, size, count, file) 读取的数据
fwrite 将数据写入文件 fwrite(buffer, size, count, file) 写入的数据
fseek 设置文件位置指针 fseek(file, offset, SEEK_SET) 0EOF
ftell 获取文件当前位置 ftell(file) 文件位置
rewind 重置文件位置指针到文件开头 rewind(file) 无返回值
fprintf 格式化输出到文件 fprintf(file, "data: %d", value) 格式化的字符串
fscanf 从文件中格式化输入 fscanf(file, "%d", &value) 读取的值
feof 检查文件是否到达文件末尾 feof(file) 非零值或 0
ferror 检查文件操作是否发生错误 ferror(file) 错误代码
clearerr 清除文件流的错误和EOF标志 clearerr(file) 无返回值

通过理解和运用这些文件操作函数,可以有效地进行文件读写操作,并处理各种文件相关的错误和状态检查。这对于实现文件管理功能以及确保程序的健壮性具有重要意义。

15. 结束语

  1. 本节内容已经全部介绍完毕,希望通过这篇文章,大家对C语言文件操作函数有了更深入的理解和认识。
  2. 感谢各位的阅读和支持,如果觉得这篇文章对你有帮助,请不要吝惜你的点赞和评论,这对我们非常重要。再次感谢大家的关注和支持
目录
相关文章
|
5天前
|
人工智能 自动驾驶 大数据
预告 | 阿里云邀您参加2024中国生成式AI大会上海站,马上报名
大会以“智能跃进 创造无限”为主题,设置主会场峰会、分会场研讨会及展览区,聚焦大模型、AI Infra等热点议题。阿里云智算集群产品解决方案负责人丛培岩将出席并发表《高性能智算集群设计思考与实践》主题演讲。观众报名现已开放。
|
21天前
|
存储 人工智能 弹性计算
阿里云弹性计算_加速计算专场精华概览 | 2024云栖大会回顾
2024年9月19-21日,2024云栖大会在杭州云栖小镇举行,阿里云智能集团资深技术专家、异构计算产品技术负责人王超等多位产品、技术专家,共同带来了题为《AI Infra的前沿技术与应用实践》的专场session。本次专场重点介绍了阿里云AI Infra 产品架构与技术能力,及用户如何使用阿里云灵骏产品进行AI大模型开发、训练和应用。围绕当下大模型训练和推理的技术难点,专家们分享了如何在阿里云上实现稳定、高效、经济的大模型训练,并通过多个客户案例展示了云上大模型训练的显著优势。
|
25天前
|
存储 人工智能 调度
阿里云吴结生:高性能计算持续创新,响应数据+AI时代的多元化负载需求
在数字化转型的大潮中,每家公司都在积极探索如何利用数据驱动业务增长,而AI技术的快速发展更是加速了这一进程。
|
16天前
|
并行计算 前端开发 物联网
全网首发!真·从0到1!万字长文带你入门Qwen2.5-Coder——介绍、体验、本地部署及简单微调
2024年11月12日,阿里云通义大模型团队正式开源通义千问代码模型全系列,包括6款Qwen2.5-Coder模型,每个规模包含Base和Instruct两个版本。其中32B尺寸的旗舰代码模型在多项基准评测中取得开源最佳成绩,成为全球最强开源代码模型,多项关键能力超越GPT-4o。Qwen2.5-Coder具备强大、多样和实用等优点,通过持续训练,结合源代码、文本代码混合数据及合成数据,显著提升了代码生成、推理和修复等核心任务的性能。此外,该模型还支持多种编程语言,并在人类偏好对齐方面表现出色。本文为周周的奇妙编程原创,阿里云社区首发,未经同意不得转载。
11602 12
|
10天前
|
人工智能 自然语言处理 前端开发
100个降噪蓝牙耳机免费领,用通义灵码从 0 开始打造一个完整APP
打开手机,录制下你完成的代码效果,发布到你的社交媒体,前 100 个@玺哥超Carry、@通义灵码的粉丝,可以免费获得一个降噪蓝牙耳机。
4098 14
|
17天前
|
人工智能 自然语言处理 前端开发
用通义灵码,从 0 开始打造一个完整APP,无需编程经验就可以完成
通义灵码携手科技博主@玺哥超carry 打造全网第一个完整的、面向普通人的自然语言编程教程。完全使用 AI,再配合简单易懂的方法,只要你会打字,就能真正做出一个完整的应用。本教程完全免费,而且为大家准备了 100 个降噪蓝牙耳机,送给前 100 个完成的粉丝。获奖的方式非常简单,只要你跟着教程完成第一课的内容就能获得。
6858 10
|
29天前
|
缓存 监控 Linux
Python 实时获取Linux服务器信息
Python 实时获取Linux服务器信息
|
15天前
|
人工智能 自然语言处理 前端开发
什么?!通义千问也可以在线开发应用了?!
阿里巴巴推出的通义千问,是一个超大规模语言模型,旨在高效处理信息和生成创意内容。它不仅能在创意文案、办公助理、学习助手等领域提供丰富交互体验,还支持定制化解决方案。近日,通义千问推出代码模式,基于Qwen2.5-Coder模型,用户即使不懂编程也能用自然语言生成应用,如个人简历、2048小游戏等。该模式通过预置模板和灵活的自定义选项,极大简化了应用开发过程,助力用户快速实现创意。
|
3天前
|
机器学习/深度学习 人工智能 安全
通义千问开源的QwQ模型,一个会思考的AI,百炼邀您第一时间体验
Qwen团队推出新成员QwQ-32B-Preview,专注于增强AI推理能力。通过深入探索和试验,该模型在数学和编程领域展现了卓越的理解力,但仍在学习和完善中。目前,QwQ-32B-Preview已上线阿里云百炼平台,提供免费体验。
|
11天前
|
人工智能 C++ iOS开发
ollama + qwen2.5-coder + VS Code + Continue 实现本地AI 辅助写代码
本文介绍在Apple M4 MacOS环境下搭建Ollama和qwen2.5-coder模型的过程。首先通过官网或Brew安装Ollama,然后下载qwen2.5-coder模型,可通过终端命令`ollama run qwen2.5-coder`启动模型进行测试。最后,在VS Code中安装Continue插件,并配置qwen2.5-coder模型用于代码开发辅助。
764 5