当前位置: 首页 > news >正文

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

LuckiBit

目录

  • C语言文件操作函数详解
    • 表格汇总
    • 1. `fopen`
    • 2. `fclose`
    • 3. `fread`
    • 4. `fwrite`
    • 5. `fseek`
    • 6. `ftell`
    • 7. `rewind`
    • 8. `fprintf`
    • 9. `fscanf`
    • 10. `feof`
    • 11. `ferror`
    • 12. `clearerr`
    • 13. 总结
    • 14. 附录:函数参考表
    • 15. 结束语
    • 相关文章:

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); // 输出: 文件位置: 5fclose(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); // 输出: 文件当前位置: 10fclose(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. 感谢各位的阅读和支持,如果觉得这篇文章对你有帮助,请不要吝惜你的点赞和评论,这对我们非常重要。再次感谢大家的关注和支持!点我关注❤️

相关文章:

  • 指针的神秘探险:从入门到精通的奇幻之旅 !

相关文章:

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

目录 C语言文件操作函数详解表格汇总1. fopen2. fclose3. fread4. fwrite5. fseek6. ftell7. rewind8. fprintf9. fscanf10. feof11. ferror12. clearerr13. 总结14. 附录&#xff1a;函数参考表15. 结束语相关文章&#xff1a; C语言文件操作函数详解 C语言提供了一组标准库函…...

Java 垃圾回收,看一遍就懂

了解 Java 垃圾收集的工作原理并优化应用程序中的内存使用情况。详细了解 Java 中内存管理的复杂性。 垃圾收集是一个关键过程&#xff0c;可以帮助任何Java 开发公司。编程语言中的这一强大功能可以巧妙地管理内存分配和释放&#xff0c;防止内存泄漏并优化资源利用率。它就像…...

手把手教你CNVD漏洞挖掘 + 资产收集

0x1 前言 挖掘CNVD漏洞有时候其实比一般的edusrc还好挖&#xff0c;但是一般要挖证书的话&#xff0c;还是需要花时间的&#xff0c;其中信息收集&#xff0c;公司资产确定等操作需要花费一定时间的。下面就记录下我之前跟一个师傅学习的一个垂直越权成功的CNVD漏洞通杀&#…...

华为云低代码AstroZero技巧教学1:表格的超链接赋能

在低代码AstroZero的标准页面设计和构建上&#xff0c;我们总是在思考如何让用户体验能够更加流畅。 为此&#xff0c;我们特推出低代码AstroZero技巧教学系列合集&#xff0c;让各位开发者能够更加方便快捷地掌握低代码AstroZero的操作技巧。 本次技巧内容&#xff1a; 在As…...

https握手过程详解

https握手过程详解 上一篇《HTTPS通讯全过程》中https握手过程实际上还有更多的细节&#xff0c;为什么会这样设计呢&#xff1f;是因为一开始将握手过程时&#xff0c;吧步骤说的太详细会导致更难理解惹。所以我就先在上一篇把部分细节忽略&#xff0c;把原来几步的过程先简化…...

Lesson 63 Thank you, doctor

Lesson 63 Thank you, doctor 词汇 better a. 更好的 搭配&#xff1a;feel better     get better 感觉好些了    成语&#xff1a;Better late than never.       晚做总比不做好。       Half a loaf is better than no bread.       有比没有好。…...

使用python和matlab实现BP神经网络算法的分析比较

分析和比较使用Python和MATLAB实现BP神经网络算法实现的复杂度、代码可读性、库支持、性能以及应用的灵活性等。 1. BP神经网络的基本原理 BP神经网络(Back Propagation Neural Network)是一种多层前馈神经网络,通过反向传播算法来训练网络。其基本思想是利用梯度下降法,…...

智慧卫生间环境传感器有哪些?智慧卫生间的特点@卓振思众

随着科技的进步和人们对生活品质的要求不断提高&#xff0c;智慧卫生间作为现代化设施的代表&#xff0c;越来越受到关注。智慧卫生间不仅仅是在外观设计上做文章&#xff0c;更在于其背后强大的智能系统&#xff0c;特别是环境传感器的应用&#xff0c;让厕所的管理和使用变得…...

智能分班结果自动发布系统

新学期&#xff0c;校园里又将迎来一批充满活力的新生。对于老师们来说&#xff0c;除了准备教学计划和课程内容&#xff0c;还有一项看似简单却颇为繁琐的任务——发布分班。传统的分班信息发布方式&#xff0c;通常是老师们一个个私信给学生家长&#xff0c;家长们收到信息后…...

vue 后台管理 指定项目别名

越多越好 文章目录 一、指定项目路径别名二、全局loading进度条实现三、动态页面标题的实现四、全局刷新 和 全屏 一、指定项目路径别名 在 vite.config.js 里配置 import path from "path"export default defineConfig({resolve:{alias:{"~":path.resol…...

【Python机器学习】FP-growth算法——构建FP树

在第二次扫描数据集时会构建一棵FP树。为构建一棵树&#xff0c;需要一个容器来保存树。 创建FP树的数据结构 FP树要比书中其他树更加复杂&#xff0c;因此需要创建一个类来保存树的每一个节点&#xff1a; class treeNode:def __init__(self,nameValue,numOccur,parentNode…...

JAVA itextpdf 段落自动分页指定固定行距打印

JAVA itextpdf 段落自动分页指定固定行距打印 前言&#xff1a;公司有个需求&#xff0c;打印的合同模板左上角要加上logo的图标。但是itext pdf 自动分页会按照默认的顶部高分页打印内容的&#xff0c;导致从第二页开始logo图标就会把合同的内容给覆盖掉了。然后尝试了挺多方法…...

基于SpringBoot+Vue的周边游平台个人管理模块的设计与实现

TOC springboot220基于SpringBootVue的周边游平台个人管理模块的设计与实现 第一章 绪论 1.1 选题背景 目前整个社会发展的速度&#xff0c;严重依赖于互联网&#xff0c;如果没有了互联网的存在&#xff0c;市场可能会一蹶不振&#xff0c;严重影响经济的发展水平&#xf…...

开源数据库同步工具monstache

Monstache是一个用Go语言编写的同步工具&#xff0c;主要用于将MongoDB中的数据同步到Elasticsearch中。它支持全量同步和增量同步&#xff0c;并提供了丰富的配置参数以及使用Go、JavaScript编写插件来自定义处理数据的逻辑的能力。Monstache 工作流程如下图&#xff1a; 以下…...

Ubuntu连接GitHub

报错&#xff1a;Please make sure you have the correct access rights and the repository exists.原因&#xff1a;本地没有SSH Key存在解决&#xff1a; 首先为系统设置github的用户名和自己的邮箱 git config --global user.name "****" git config --global us…...

微信支付流程

1. 创建订单 请求创建订单的 API 接口&#xff1a;把 订单金额、收货地址、订单中包含的商品信息 发送到服务器服务器响应的结果&#xff1a;订单编号 2.订单预支付 请求订单预支付的 API 接口&#xff1a;把步骤1得到的 订单编号 发送到服务器服务器响应的结果&#xff1a;…...

LVS理论知识

目录 1.描述以及工作原理 1.什么是LVS 2.LVS调度算法 1.静态调度算法 1.轮询RR 2.加权轮询WRR 3.目标地址hash---DH 4.源地址hash---SH 2.动态调度算法 1.LC最少连接 2.wlc加权最少连接 3.sed最少期望延迟 4.nq不排队调度算法 5.lblc基于本地最少连接 6.lnlcr带…...

uniapp接口请求this.$request

代码示例&#xff1a; createPhoto(url) {this.$request({url: /emp/gallery-photo/create,//后端接口method: post,//请求方法header: {//请求头tenant-id: 1,},data: {//请求参数galleryId: this.albumId,empUserId: this.empUserId,"url": url,}}).then((res) &…...

vulnhub靶机 W34KN3SS(渗透测试详解)

一、靶机信息收集 1、靶机下载地址 https://download.vulnhub.com/w34kn3ss/W34KN3SS.ova 2、扫描靶机IP 3、探测靶机端口、主机、服务版本信息 nmap -sS -sV -A -p- 192.168.31.160 4、进行目录扫描 二、web渗透测试 1、访问靶机IP 没什么发现 2、进行目录拼接访问 拼接…...

2024年8月16日嵌入式学习

今日复习信号量的知识点和学习了进程间通信和管道 总结信息量: 共享进程资源 方便 线程 抢占公共资源 带来的问题 1. 互斥访问 需要互斥锁 来保障 原子性操作 使 操作过程 完整 互斥锁: a.初始化 锁 b.加锁 //使用资源之前 …...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启&#xff0c;数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后&#xff0c;存在与用户组权限相关的问题。具体表现为&#xff0c;Oracle 实例的运行用户&#xff08;oracle&#xff09;和集…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)

概述 在 Swift 开发语言中&#xff0c;各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过&#xff0c;在涉及到多个子类派生于基类进行多态模拟的场景下&#xff0c;…...

Python爬虫实战:研究feedparser库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

深入理解JavaScript设计模式之单例模式

目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式&#xff08;Singleton Pattern&#…...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...

中医有效性探讨

文章目录 西医是如何发展到以生物化学为药理基础的现代医学&#xff1f;传统医学奠基期&#xff08;远古 - 17 世纪&#xff09;近代医学转型期&#xff08;17 世纪 - 19 世纪末&#xff09;​现代医学成熟期&#xff08;20世纪至今&#xff09; 中医的源远流长和一脉相承远古至…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)

前言&#xff1a; 最近在做行为检测相关的模型&#xff0c;用的是时空图卷积网络&#xff08;STGCN&#xff09;&#xff0c;但原有kinetic-400数据集数据质量较低&#xff0c;需要进行细粒度的标注&#xff0c;同时粗略搜了下已有开源工具基本都集中于图像分割这块&#xff0c…...

初探Service服务发现机制

1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能&#xff1a;服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源&#xf…...