C语言之文件操作

目录

实现文件读写

打开文件fopen函数的用法

写文件fprintf函数的用法

读文件fscanf函数的用法

写文件fwrite函数的用法

读文件fread函数的用法

关闭文件fclose函数的用法


实现文件读写

一直以来,我们学习C语言都是数据的处理,这些数据都是在内存中的。一旦程序结束程序结束退出,数据也将灰飞烟灭。文件操作的实现将帮助我们把数据存储到文件中,既硬盘上的文件,如我们所熟知的txt格式,或其他各种后缀的文件,避免程序结束后数据丢失,实现存储数据的功能,甚至充当“数据库”的功能。

下面详细说明每步的作用及详细办法。

1、打开文件:要读取或写入文件,首先需要打开它。可以使用fopen函数来打开文件。

2、读取文件:在打开文件后,可以使用fscanf、fgets等函数来从文件中读取内容。

3、写入文件:在打开文件后,可以使用fprintf、fputs等函数将数据写入文件。

4、关闭文件:在文件读写完成后,应该使用fclose函数关闭文件,以释放系统资源。

以上就是C语言对文件操作的四个步骤及大致解释,下面将展开详细详解!

打开文件fopen函数的用法

fopen()函数是C语言中用于打开文件的函数,它的原型如下:

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

其中,filename参数是要打开的文件名(包括路径),mode参数是打开文件的模式。

fopen()函数返回一个指向FILE类型结构体的指针,该指针可以用于后续的文件读写操作。如果打开文件失败,则返回NULL。

mode参数是打开文件的模式,常见的模式有以下几种:

参数作用
r以只读方式打开文件,该文件必须存在。
r+以读/写方式打开文件,该文件必须存在。
rb+以读/写方式打开一个二进制文件,只允许读/写数据。
rt+以读/写方式打开一个文本文件,允许读和写。
w打开只写文件,若文件存在则文件长度清为零,即该文件内容会消失;若文件不存在则创建该文件。
w+打开可读/写文件,若文件存在则文件长度清为零,即该文件内容会消失;若文件不存在则创建该文件。
a以附加的方式打开只写文件。若文件不存在,则会创建该文件;如果文件存在,则写入的数据会被加到文件尾后,即文件原先的内容会被保留(EOF 符保留)。
a+以附加方式打开可读/写的文件。若文件不存在,则会创建该文件,如果文件存在,则写入的数据会被加到文件尾后,即文件原先的内容会被保留(EOF符不保留)。
wb以只写方式打开或新建一个二进制文件,只允许写数据。
wb+以读/写方式打开或新建一个二进制文件,允许读和写。
wt+以读/写方式打开或新建一个文本文件,允许读和写。
at+以读/写方式打开一个文本文件,允许读或在文本末追加数据。
ab+以读/写方式打开一个二进制文件,允许读或在文件末追加数据。

下面是一个简单的示例,演示了如何使用fopen()函数打开一个文本文件:

#include <stdio.h>int main() {FILE *fp;fp = fopen("file.txt", "r");if (fp == NULL) {printf("Failed to open file.\n");return 1;}// 文件读写操作fclose(fp);return 0;
}

在上述示例中,首先使用fopen()函数打开一个名为"file.txt"的文本文件,并指定以只读模式打开。如果打开文件失败,则输出错误信息并退出程序。

接下来,可以在fp指针所指向的文件中进行读写操作。最后,使用fclose()函数关闭文件,以释放系统资源。

需要注意的是,在进行文件操作时,应该检查文件是否成功打开、读取或写入,以及文件是否成功关闭。此外,还应该处理可能出现的错误情况,例如文件不存在或无法访问等。

在实际应用中,还可以使用其他相关函数,如freopen()、fdopen()等,来重新打开文件或将文件描述符转换为FILE类型指针等操作。根据具体需求,可以选择合适的函数和方法来实现文件读写操作。

写文件fprintf函数的用法

fprintf()函数是C语言中用于将格式化数据写入文件的函数,它的原型如下:

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

其中,stream参数是指向已打开文件的指针,format参数是格式化字符串,用于指定要写入的数据类型和格式,后续参数是要写入的数据。

fprintf()函数返回成功写入的字符数,如果发生错误则返回一个负值。

控制符作用
%c字符
%d 或 %i有符号十进制整数
%e使用 e 字符的科学科学记数法(尾数和指数)
%E使用 E 字符的科学科学记数法(尾数和指数)
%f十进制浮点数
%g自动选择 %e 或 %f 中合适的表示法
%G自动选择 %E 或 %f 中合适的表示法
%o有符号八进制
%s字符的字符串
%u无符号十进制整数
%x无符号十六进制整数
%X无符号十六进制整数(大写字母)
%p指针地址
%n无输出
%字符

更多的格式可以参照printf的用法中的格式,可以通用。

下面是一个简单的示例,演示了如何使用fprintf()函数将数据写入文件:

#include <stdio.h>int main() {FILE *fp;fp = fopen("file.txt", "w");if (fp == NULL) {printf("Failed to open file.\n");return 1;}int num = 10;float pi = 3.14159;char str[] = "Hello, World!";fprintf(fp, "Number: %d\n", num);fprintf(fp, "Pi: %.2f\n", pi);fprintf(fp, "String: %s\n", str);fclose(fp);return 0;
}

在上述示例中,首先使用fopen()函数以写入模式打开一个名为"file.txt"的文本文件。如果打开文件失败,则输出错误信息并退出程序。

接下来,使用fprintf()函数将数据按照指定的格式写入文件。在这个例子中,我们分别写入一个整数、一个浮点数和一个字符串。格式化字符串中的占位符(如%d、%.2f、%s)会被对应的参数值替换。

最后,使用fclose()函数关闭文件,以释放系统资源。

需要注意的是,在进行文件操作时,应该检查文件是否成功打开、读取或写入,以及文件是否成功关闭。此外,还应该处理可能出现的错误情况,例如文件不存在或无法访问等。

除了fprintf()函数,C语言还提供了其他一些用于写入文件的函数,如fputc()、fputs()等。根据具体需求,可以选择合适的函数和方法来实现文件写入操作。

需要注意理解的是,fprintf函数虽然和printf函数很像,表示输出,但准确说是是写入的意思,是指程序向文件里写,要清楚数据的流向。

读文件fscanf函数的用法

fscanf()函数是C语言中用于从文件中读取格式化数据的函数,它的原型如下:

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

其中,stream参数是指向已打开文件的指针,format参数是格式化字符串,用于指定要读取的数据类型和格式,后续参数是用于存储读取结果的变量。

fscanf()函数返回成功读取的项目数,如果发生错误则返回一个负值。

更多fscanf的格式如下表:

格式作用
%d读入一个十进制整数
%i读入十进制,八进制,十六进制整数,与%d类似,但是在编译时通过数据前置或后置来区分进制,如加入“0x”则是十六进制,加入“0”则为八进制。例如串“031”使用%d时会被算作31,但是使用%i时会算作25
%u读入一个无符号十进制整数
%f %F %g %G用来输入实数,可以用小数形式或指数形式输入
%x %x 读入十六进制整数
%o读入八进制整数
%s直到遇到一个空格字符(空格字符可以是空白、换行和制表符)
%c单个字符:读取下一个字符。如果指定了一个不为 1 的宽度 width,函数会读取 width 个字符,并通过参数传递,把它们存储在数组中连续位置。在末尾不会追加空字符

下面是一个简单的示例,演示了如何使用fscanf()函数从文件中读取数据:

#include <stdio.h>int main() {FILE *fp;fp = fopen("file.txt", "r");if (fp == NULL) {printf("Failed to open file.\n");return 1;}int num;float pi;char str[50];fscanf(fp, "%d", &num);fscanf(fp, "%f", &pi);fscanf(fp, "%s", str);printf("Number: %d\n", num);printf("Pi: %.2f\n", pi);printf("String: %s\n", str);fclose(fp);return 0;
}

在上述示例中,首先使用fopen()函数以只读模式打开一个名为"file.txt"的文本文件。如果打开文件失败,则输出错误信息并退出程序。

接下来,使用fscanf()函数从文件中按照指定的格式读取数据。在这个例子中,我们分别读取一个整数、一个浮点数和一个字符串。格式化字符串中的占位符(如%d、%f、%s)会将文件中的数据解析并存储到对应的变量中。

最后,使用printf()函数将读取到的数据输出到控制台。

需要注意的是,在进行文件操作时,应该检查文件是否成功打开、读取或写入,以及文件是否成功关闭。此外,还应该处理可能出现的错误情况,例如文件不存在或无法访问等。

除了fscanf()函数,C语言还提供了其他一些用于从文件中读取数据的函数,如fgetc()、fgets()等。根据具体需求,可以选择合适的函数和方法来实现文件读取操作。

写文件fwrite函数的用法

fwrite()函数是C语言中用于将数据块写入文件的函数,它的原型如下:

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

其中,ptr参数是指向要写入的数据块的指针,size参数是每个数据项的大小(以字节为单位),count参数是要写入的数据项的数量,stream参数是指向已打开文件的指针。

fwrite()函数返回成功写入的数据项数。如果发生错误或到达文件末尾,则返回一个小于count的值。

下面是一个简单的示例,演示了如何使用fwrite()函数将数据块写入文件:

#include <stdio.h>struct Person {char name[50];int age;
};int main() {FILE *fp;fp = fopen("file.bin", "wb");if (fp == NULL) {printf("Failed to open file.\n");return 1;}struct Person p1 = {"John", 25};struct Person p2 = {"Alice", 30};fwrite(&p1, sizeof(struct Person), 1, fp);fwrite(&p2, sizeof(struct Person), 1, fp);fclose(fp);return 0;
}

在上述示例中,首先使用fopen()函数以二进制写入模式打开一个名为"file.bin"的文件。如果打开文件失败,则输出错误信息并退出程序。

接下来,定义了一个名为Person的结构体,表示一个人的信息,包括姓名和年龄。

然后,创建了两个Person类型的变量p1和p2,并分别初始化它们的值。

使用fwrite()函数将p1和p2的数据块写入文件。sizeof(struct Person)用于获取Person结构体的大小,以字节为单位。通过取地址运算符&获取结构体变量的内存地址。

最后,使用fclose()函数关闭文件,以释放系统资源。

需要注意的是,在进行文件操作时,应该检查文件是否成功打开、读取或写入,以及文件是否成功关闭。此外,还应该处理可能出现的错误情况,例如文件不存在或无法访问等。

除了fwrite()函数,C语言还提供了其他一些用于写入文件的函数,如fputc()、fputs()等。根据具体需求,可以选择合适的函数和方法来实现文件写入操作。

读文件fread函数的用法

与fwrite是一对,fread()函数是C语言中用于从文件中读取数据块的函数,它的原型如下:

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

其中,ptr参数是指向存储读取数据的缓冲区的指针,size参数是每个数据项的大小(以字节为单位),count参数是要读取的数据项的数量,stream参数是指向已打开文件的指针。

fread()函数返回成功读取的数据项数。如果发生错误或到达文件末尾,则返回一个小于count的值。

下面是一个简单的示例,演示了如何使用fread()函数从文件中读取数据块:

#include <stdio.h>struct Person {char name[50];int age;
};int main() {FILE *fp;fp = fopen("file.bin", "rb");if (fp == NULL) {printf("Failed to open file.\n");return 1;}struct Person p1, p2;fread(&p1, sizeof(struct Person), 1, fp);fread(&p2, sizeof(struct Person), 1, fp);printf("Person 1: %s, %d\n", p1.name, p1.age);printf("Person 2: %s, %d\n", p2.name, p2.age);fclose(fp);return 0;
}

在上述示例中,首先使用fopen()函数以二进制读取模式打开一个名为"file.bin"的文件。如果打开文件失败,则输出错误信息并退出程序。

接下来,定义了一个名为Person的结构体,表示一个人的信息,包括姓名和年龄。

然后,创建了两个Person类型的变量p1和p2。

使用fread()函数从文件中读取p1和p2的数据块。sizeof(struct Person)用于获取Person结构体的大小,以字节为单位。通过取地址运算符&获取结构体变量的内存地址。

最后,使用printf()函数将读取到的数据输出到控制台,并使用fclose()函数关闭文件,以释放系统资源。

需要注意的是,在进行文件操作时,应该检查文件是否成功打开、读取或写入,以及文件是否成功关闭。此外,还应该处理可能出现的错误情况,例如文件不存在或无法访问等。

除了fread()函数,C语言还提供了其他一些用于读取文件的函数,如fgetc()、fgets()等。根据具体需求,可以选择合适的函数和方法来实现文件读取操作。

关闭文件fclose函数的用法

fclose()函数用于关闭已打开的文件,切断IO数据流,以释放系统资源并确保文件的正确关闭。它的原型如下:

int fclose(FILE *stream);

其中,stream参数是指向已打开文件的指针。

fclose()函数返回一个整数值,如果成功关闭文件,则返回0;如果关闭文件失败,则返回-1。

下面是一个示例,演示了如何使用fclose()函数关闭文件:

#include <stdio.h>int main() {FILE *fp;fp = fopen("file.txt", "r");if (fp == NULL) {printf("Failed to open file.\n");return 1;}// 文件操作...int result = fclose(fp);if (result == 0) {printf("File closed successfully.\n");} else {printf("Failed to close file.\n");}return 0;
}

在上述示例中,首先使用fopen()函数以只读模式打开一个名为"file.txt"的文件。如果打开文件失败,则输出错误信息并退出程序。

接下来,进行文件操作(此处省略具体操作)。

然后,使用fclose()函数关闭已打开的文件。通过传递之前打开文件时返回的文件指针作为参数。

最后,根据fclose()函数的返回值判断文件是否成功关闭,并输出相应的信息。

需要注意的是,在进行文件操作时,应该检查文件是否成功打开、读取或写入,以及文件是否成功关闭。此外,还应该处理可能出现的错误情况,例如文件不存在或无法访问等。

在关闭文件之前,确保已完成对文件的所有操作,以避免数据丢失或不完整的情况。关闭文件后,将无法再对其进行读取或写入操作。

另外,如果程序中有多个文件需要关闭,可以依次使用fclose()函数关闭它们。每个文件都应该有对应的文件指针,并确保在适当的时候关闭它们,以避免资源泄漏。

总结起来,fclose()函数是C语言中用于关闭文件的函数,通过传递文件指针作为参数来关闭已打开的文件。在文件操作完成后,及时关闭文件是良好的编程习惯,可以避免资源浪费和潜在的问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/119389.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决javascript报错:SyntaxError: Invalid Unicode escape sequence

在处理cookie时报这个错&#xff1a; 网上搜了一圈都说是反斜杠问题&#xff0c;要把\替换成/ 但是试了网上的replace替换&#xff1a; replace(/\\/g, /) 结果没有用&#xff01;&#xff01;&#xff01; 然后我干脆直接做了一个最简单字符串赋值&#xff0c;再打印出来。…

0036【Edabit ★☆☆☆☆☆】【让我加油】Let‘s Fuel Up!

0036【Edabit ★☆☆☆☆☆】【让我加油 】Let’s Fuel Up! control_flow language_fundamentals numbers Instructions A vehicle needs 10 times the amount of fuel than the distance it travels. However, it must always carry a minimum of 100 fuel before setting o…

C++ stack 的使用

目录 1. 无参构造函数 2. void push(const T& x) 3. void pop() 4. T& top() 5. bool empty() 6. size_t size() 7. 总结 1. stack是一种容器适配器&#xff0c;专门用在具有后进先出操作的上下文环境中&#xff0c;其删除只能从容器的一端进行 元素的插入与…

快递排序Java

快速排序是在工具类常用的排序算法&#xff0c;快速排序的思想主要是选定一个基准元素&#xff0c;然后找到基准元素的位置&#xff0c;然后再分别排序他左边的和他右边的,快速排序是不稳定的&#xff0c;时间复杂度位Nlog(N),最极端的情况就是一个反向排好顺序的数组&#xff…

leetcode55. 跳跃游戏

leetcode55. 跳跃游戏 方案一&#xff1a;dfs超时 class Solution { public:bool dfs(vector<int>& nums, int idx){if (idx (nums.size() - 1))return true;int dist nums.size() - idx;for (int i 0; (i < nums[idx]) && (i < dist); i) {if (d…

【机器学习合集】人脸表情分类任务Pytorch实现TensorBoardX的使用 ->(个人学习记录笔记)

人脸表情分类任务 注意&#xff1a;整个项目来自阿里云天池&#xff0c;下面是开发人员的联系方式&#xff0c;本人仅作为学习记录&#xff01;&#xff01;&#xff01;该文章原因&#xff0c;学习该项目&#xff0c;完善注释内容&#xff0c;针对新版本的Pytorch进行部分代码…

快速入门Elasticsearch:安装、基本概念、分词器和文档基本操作详解

本文主要介绍快速入门 Elasticsearch&#xff0c;从 安装 、 基本概念 、 分词器 、*** 文档基本操作 *** 这 4 个方面快速入门。 Elasticsearch 是一款近实时的搜索引擎&#xff0c;底层是基于 Lucene 做搜索&#xff0c;再此基础上加入了分布式的特性&#xff0c;以便支持海…

2022年12月 Python(一级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 关于Python语言的注释,以下选项中描述错误的是?( ) A: Python语言有两种注释方式:单行注释和多行注释 B: Python语言的单行注释以#开头 C: Python多行注释使用###来做为标记 D: …

RabbitMQ高级篇 笔记

这是一些高级的内容。 RabbitMQ还是运行在网络上的&#xff0c;倘若遇到了网络故障&#xff0c;mq自己挂了&#xff0c;出异常了&#xff0c;都会造成最终状态不一致的问题。这就是可靠性问题。 可靠性&#xff1a;一个消息发送出去之后&#xff0c;至少被消费1次。 要解决这3个…

十九、类型信息(1)

本章概要 为什么需要 RTTI RTTI&#xff08;RunTime Type Information&#xff0c;运行时类型信息&#xff09;能够在程序运行时发现和使用类型信息 RTTI 把我们从只能在编译期进行面向类型操作的禁锢中解脱了出来&#xff0c;并且让我们可以使用某些非常强大的程序。对 RTTI …

第十三章:L2JMobius学习 – 玩家攻击怪物

本章节&#xff0c;我们学习一下玩家周边怪物的刷新。在上一章节中&#xff0c;我们提过这个事情。当玩家移动完毕之后&#xff0c;会显示周围的游戏对象&#xff0c;其中就包括NPC怪物。当然&#xff0c;玩家“孵化”自己&#xff08;调用spawnMe方法&#xff09;的时候&#…

Hadoop分布式安装

首先准备好三台服务器或者虚拟机&#xff0c;我本机安装了三个虚拟机&#xff0c;安装虚拟机的步骤参考我之前的一篇 virtualBox虚拟机安装多个主机访问虚拟机虚拟机访问外网配置-CSDN博客 jdk安装 参考文档&#xff1a;Linux 环境下安装JDK1.8并配置环境变量_linux安装jdk1.8并…

Zoho Mail荣登福布斯2023年企业邮箱榜单,引领行业新方向!

几十年来&#xff0c;电子邮件一直是电子通信的重要形式&#xff0c;并且在未来的许多年里&#xff0c;它可能会无处不在。尽管有大量免费电子邮件服务可供用户和企业使用&#xff0c;但其中许多服务缺乏专门的功能&#xff0c;例如适合办公室使用的集中管理。 福布斯小型企业顾…

1024特别剪辑: 使用Python Turtle 库绘制一棵随机生成的树

&#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;强烈推荐优质专栏: &#x1f354;&#x1f35f;&#x1f32f;C的世界(持续更新中) &#x1f43b;推荐专栏1: &#x1f354;&#x1f35f;&#x1f32f;C语言初阶 &#x1f43b;推荐专栏2: &#x1f354;…

MYSQL(事务+锁+MVCC+SQL执行流程)理解(2)

一)MYSQL中的锁(知识补充) 可以通过In_use字段来进行判断是否针对于表进行加了锁 1)对于undo log日志来说:新增类型的&#xff0c;在事务提交之后就可以清除掉了&#xff0c;修改类型的&#xff0c;事务提交之后不能立即清除掉这些日志会用于mvcc只有当没有事务用到该版本信息时…

【原创】解决Kotlin无法使用@Slf4j注解的问题

前言 主要还是辟谣之前的网上的用法&#xff0c;当然也会给出最终的使用方法。这可是Kotlin&#xff0c;关Slf4j何事&#xff01;&#xff1f; 辟谣内容&#xff1a;创建注解来解决这个问题 例如&#xff1a; Target(AnnotationTarget.CLASS) Retention(AnnotationRetentio…

等离子体共振和ENZ模式的场增强效应提高ITO对THz产生的非线性响应

利用等离子体共振和ENZ模式的场增强效应提高ITO对THz产生的非线性响应,SRR超表面的共振被设计成与λENZ紧密对齐。然而&#xff0c;ITO薄膜的加入&#xff0c;强烈地改变了透射光谱。 在x偏振照明下观察到共振分裂,在λENZ周围出现了一个明显的透明窗口,类似于等离子体诱导的透…

Spark内核调度

目录 一、DAG &#xff08;1&#xff09;概念 &#xff08;2&#xff09;Job和Action关系 &#xff08;3&#xff09;DAG的宽窄依赖关系和阶段划分 二、Spark内存迭代计算 三、spark的并行度 &#xff08;1&#xff09;并行度设置 &#xff08;2&#xff09;集群中如何规划并…

javascript IP地址正则表达式

/^(1[0-9]{2}|2[0-4][0-9]|25[0-5]|(\d){1,2})\.(1[0-9]{2}|2[0-4][0-9]|25[0-5]|(\d){1,2}|0)\.(1[0-9]{2}|2[0-4][0-9]|25[0-5]|(\d){1,2}|0)\.(1[0-9]{2}|2[0-4][0-9]|25[0-5]|(\d){1,2}|0)$/g.test(10.2.35.8) 注&#xff1a; 一定不要把表达式赋值给变量&#xff0c;直接…

软考-网络安全审计技术原理与应用

本文为作者学习文章&#xff0c;按作者习惯写成&#xff0c;如有错误或需要追加内容请留言&#xff08;不喜勿喷&#xff09; 本文为追加文章&#xff0c;后期慢慢追加 by 2023年10月 网络安全审计概念 等级保护网络安全审计是指对涉及国家安全、重要利益或关键信息基础设施…