【C语言11】文件操作(fgtec,fputc,fgets,fputs,fscanf,fprintf)

news2024/11/14 16:52:59

请添加图片描述

1.什么是文件

磁盘上的文件是文件。
但是在程序设计中,我们一般谈的文件有两种:程序文件、数据文件(从文件功能的角度来分类的)。

程序文件

包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(windows环境
后缀为.exe)。

数据文件

文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,
或者输出内容的文件。
本章讨论的是数据文件。
在以前各章所处理数据的输入输出都是以终端为对象的,即从终端的键盘输入数据,运行结果显示到显
示器上。
其实有时候我们会把信息输出到磁盘上,当需要的时候再从磁盘上把数据读取到内存中使用,这里处理
的就是磁盘上文件。

2.文件的打开与使用

1.文件指针

(此次博文以vs2013示例 )
在vs2013中,有这么一份代码

struct _iobuf {
        char *_ptr;
        int   _cnt;
        char *_base;
        int   _flag;
        int   _file;
        int   _charbuf;
        int   _bufsiz;
        char *_tmpfname;
       };
typedef struct _iobuf FILE;

该代码是由vs自行提供的,主要目的是方便用户的使用
每当打开一个文件的时候,系统会根据文件的情况自动创建一个FILE结构的变量,并填充其中的信息,
使用者不必关心细节。
一般都是通过一个FILE的指针来维护这个FILE结构的变量,。所以当我们们想要读写一个文件时,可以很好的来使用它。下面我们用一串代码实现读文件,而打开文件有着多种操作命令,我们先来认识一下。

  • “r”(只读): 为了输入数据,打开一个已经存在的文本文件。如果文件不存在,则会出错。
  • “w”(只写): 为了输出数据,打开一个文本文件。如果文件不存在,则会创建一个新的文件。
  • “a”(追加): 向文本文件尾添加数据。如果文件不存在,则会创建一个新的文件。
  • “rb”(只读): 为了输入数据,打开一个二进制文件。如果文件不存在,则会出错。
  • “wb”(只写): 为了输出数据,打开一个二进制文件。如果文件不存在,则会创建一个新的文件。
  • “ab”(追加): 向一个二进制文件尾添加数据。如果文件不存在,则会创建一个新的文件。
  • “r+”(读写): 为了读和写,打开一个文本文件。如果文件不存在,则会出错。
  • “w+”(读写): 为了读和写,建议一个新的文件。如果文件不存在,则会创建一个新的文件。
  • “a+”(读写): 打开一个文件,在文件尾进行读写。如果文件不存在,则会创建一个新的文件。
  • “rb+”(读写): 为了读和写打开一个二进制文件。如果文件不存在,则会出错。
  • “wb+”(读写): 为了读和写,新建一个新的二进制文件。如果文件不存在,则会创建一个新的文件。
  • “ab+”(读写): 打开一个二进制文件,在文件尾进行读和写。如果文件不存在,则会创建一个新的文件。

2.1文件的打开与关闭

在这里插入图片描述
掌握了文件的打开与关闭后,我们就可以用指令来完成一些简单的文件操作了

3.文件的读与写

函数名称适用流
fgetc所有输入流
fputc所有输出流
fgets所有输入流
fputs所有输出流
fscanf所有输入流
fprintf所有输出流

3.1 fgetc与fputc

*int fgetc(FILE stream)
参数
stream – 这是指向 FILE 对象的指针,该 FILE 对象标识了要在上面执行操作的流。
返回值
该函数以无符号 char 强制转换为 int 的形式返回读取的字符,如果到达文件末尾或发生读错误,则返回 EOF。

*int fputc(int char, FILE stream)
参数
char – 这是要被写入的字符。该字符以其对应的 int 值进行传递。
stream – 这是指向 FILE 对象的指针,该 FILE 对象标识了要被写入字符的流。
返回值
如果没有发生错误,则返回被写入的字符。如果发生错误,则返回 EOF,并设置错误标识符。
代码实现


int main()
{
	FILE* file = fopen("file.txt", "wb");//打开一个文件,以二进制输出的方式打开;
	if (file == NULL)//判断文件指针是否接收成功
	{
		perror("file");
		return;
	}
	for (int i = 'a'; i <= 'z'; i++)//循环写入
	{
		fputc(i, file);
	}
	fclose(file);//关闭文件
	file = NULL;//释放内存

	return 0;
}

当完成代码写入后,我们的项目文件下就会多一个自行创建的文件夹,切内容为字符a开始,字符z结尾;
在这里插入图片描述

int main()
{
	FILE* file = fopen("file.txt", "rb");//打开一个文件,以二进制输入的方式打开;
	if (file == NULL)//判断文件指针是否接收成功
	{
		perror("file");
		return;
	}
	char arr;
	for (int i = 0; i < 32; i++)//循环输入
	{
		arr =fgetc(file);
		printf("%c ", arr);
	}
	fclose(file);//关闭文件
	file = NULL;//释放内存

	return 0;
}

输入结果
在这里插入图片描述

3.2fgets与fputs

**char *fgets(char str, int n, FILE stream)
参数
str – 这是指向一个字符数组的指针,该数组存储了要读取的字符串。
n – 这是要读取的最大字符数(包括最后的空字符)。通常是使用以 str 传递的数组长度。
stream – 这是指向 FILE 对象的指针,该 FILE 对象标识了要从中读取字符的流。
返回值
如果成功,该函数返回相同的 str 参数。如果到达文件末尾或者没有读取到任何字符,str 的内容保持不变,并返回一个空指针。

如果发生错误,返回一个空指针。

**int fputs(const char str, FILE stream)
参数
str – 这是一个数组,包含了要写入的以空字符终止的字符序列。
stream – 这是指向 FILE 对象的指针,该 FILE 对象标识了要被写入字符串的流。
返回值
该函数返回一个非负值,如果发生错误则返回 EOF。
代码实现
fputs与fputc的差别就在于一个一次输出一串字符,一个一次输出一个字符

int main()
{
	FILE* file = fopen("file.txt", "wb");//打开一个文件,以二进制输入的方式打开;
	if (file == NULL)//判断文件指针是否接收成功
	{
		perror("file");
		return;
	}
	fputs("hello,world", file);//输出字符
	fclose(file);//关闭文件
	file = NULL;//释放内存

	return 0;
}

在这里插入图片描述
接下来使用fgtes输入

int main()
{
	FILE* file = fopen("file.txt", "rb");//打开一个文件,以二进制输入的方式打开;
	if (file == NULL)//判断文件指针是否接收成功
	{
		perror("file");
		return;
	}
	char arr[20];//创建数组接收从文件中输入的字符串
	int len = strlen("hello,world");
	fgets(arr,len+1, file);//输入字符串,fgtes的特性会导致'\0'也算一个字符,所以+1;
	printf("%s", arr);//打印
	fclose(file);//关闭文件
	file = NULL;//释放内存

	return 0;
}

在这里插入图片描述

3.3fprintf与fscanf

**int fprintf(FILE stream, const char format, …)
参数
stream – 这是指向 FILE 对象的指针,该 FILE 对象标识了流。
format – 这是 C 字符串,包含了要被写入到流 stream 中的文本。它可以包含嵌入的 format 标签,format 标签可被随后的附加参数中指定的值替换,并按需求进行格式化
返回值
如果成功,则返回写入的字符总数,否则返回一个负数。

**int fscanf(FILE stream, const char format, …)
参数
stream – 这是指向 FILE 对象的指针,该 FILE 对象标识了流。
format – 这是 C 字符串,包含了以下各项中的一个或多个:空格字符、非空格字符 和 format 说明符。
返回值
如果成功,该函数返回成功匹配和赋值的个数。如果到达文件末尾或发生读错误,则返回 EOF。

struct s//定义一个结构体
{
	char arr[10];
	int b;
	char c[10];
};
int main()
{
	FILE* file = fopen("file.txt", "wb");//打开一个文件,以二进制输入的方式打开;
	if (file == NULL)//判断文件指针是否接收成功
	{
		perror("file");
		return;
	}
	struct s i = { 'a',100,'c' };//结构体初始化
	fprintf(file, "%s %d %s", i.arr, i.b, i.c);//输出到文件中
	fclose(file);//关闭文件
	file = NULL;//释放内存

	return 0;
}

运行结果
在这里插入图片描述

struct s//定义一个结构体
{
	char arr[10];
	int b;
	char c[10];
};
int main()
{
	FILE* file = fopen("file.txt", "rb");//打开一个文件,以二进制输入的方式打开;
	if (file == NULL)//判断文件指针是否接收成功
	{
		perror("file");
		return;
	}
	struct s i = { 0 };//结构体初始化
	fscanf(file, "%s %d %s", i.arr, &(i.b), i.c);
	printf("%s %d %s", i.arr, i.b, i.c);
	fclose(file);
	file = NULL;//释放内存

	return 0;
}

在这里插入图片描述
fprintf和fscanf的输出输入是多样的,只要你传递给他正确的格式即可

谢谢观看。

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

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

相关文章

unittest教程__expectedFailure预期用例失败(5)

在断言用例执行结果时&#xff0c;会出现预期结果与实际结果不一致的情况&#xff0c;此时我们明确知道用例执行结果为FAIL&#xff0c;不想看到打印错误信息怎么办&#xff1f; 使用装饰器unittest.expectedFailure标记该用例。 import unittestclass Demo(unittest.TestCas…

Tcl常用命令备忘录-format与scan

format 语法&#xff1a;format formatString arg arg ... 参数介绍&#xff1a; formatString&#xff1a;格式化字符串&#xff0c;使用各种标识符和修饰符进行格式化。arg&#xff1a;被格式化的变量或字符串。 Tcl语言中的format命令可以用来格式化字符串输出&#xff…

Autosar代码解析-Source Insight的使用

文章目录 一、Source Insight简介二、Autosar代码查看三、解决办法一、Source Insight简介 Source insight是一款简洁、强大的轻量级代码浏览编辑器,启动快、使用便捷,很多程序员应该都使用过!它几乎支持所有的语言,比如C、C++、ASMA汇编、HTML等,能创建并维护其高性能的符…

【软件测试】性能测试服务端—排查指标问题(详细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 软件性能测试的目…

【数据类型】C#和Sql Server、Mysql、Oracle等常见数据库的数据类型对应关系

&#x1f3c6;&#x1f3c6;这是小5写的第二篇城市领跑者文章&#xff0c;一起为所在城市领跑助力吧&#xff01; &#x1f3c6;&#x1f3c6;在实际项目中&#xff0c;不管是用C#后端编程语言也好&#xff0c;还是Java后端编程语言&#xff0c;都可能会用到不同端的数据类型转…

JAVA-MAVEN初学者教程(配置、pom.xml、依赖管理等)

目录 认识MAVEN安装&配置MAVENwindows安装MAVENMAVEN的配置本地仓库 localRepository镜像 mirrors代理仓库 respositories代理 proxies IDEA配置MAVEN&#xff08;一个module&#xff09; MAVEN生命周期install下载包 模块的pom.xml坐标gav打包方式 package属性值 properti…

2023最全Java面试八股(涵盖所有Java核心面试知识点),立刻收藏

2022已成为过去式&#xff0c;不论这一年好与坏&#xff0c;我们都需要抓住新一年的机会&#xff0c;跳槽涨薪&#xff0c;还是学习提升&#xff01;先给自己定一个小目标&#xff0c;然后再朝着目标去努力就完事儿了&#xff01; 为了帮大家节约时间&#xff0c;给大家搞来了2…

9.反射和Lambda表达式

目录 一、反射 1.反射是什么 2.反射操作的四个核心类&#xff08;都处在java.lang.reflect&#xff09; 3.在java中获取一个类的class对象一共有三种途径&#xff1a; 4.想通过反射来操作类或者对象&#xff0c;第一步就是要获得该类的class对象。 5.Constructor应用 6.Met…

LabVIEW开发光线追踪可视化分段反射器测试台

LabVIEW开发光线追踪可视化分段反射器测试台 为了满足美国国家航空航天局&#xff08;NASA&#xff09;对未来望远镜的要求&#xff0c;新的红外空间天文台将在哈勃太空望远镜使用寿命结束后取代其。作为HST的继任者&#xff0c;詹姆斯韦伯太空望远镜&#xff08;JWST&#xf…

零基础小白如何快速入门网络安全/Web安全?

前言 网络安全现在是朝阳行业&#xff0c;缺口是很大。不过网络安全行业就是需要技术很多的人达不到企业要求才导致人才缺口大 初级的现在有很多的运维人员转网络安全&#xff0c;初级也会慢慢的卷起来&#xff0c;但是岗位多不用怕&#xff0c;以后各大厂也都会要网络安全人…

scratch lenet(6): feature_map可视化的C语言实现

scratch lenet(6): feature_map可视化的C语言实现 文章目录 scratch lenet(6): feature_map可视化的C语言实现1. 目的2. FeatureMap 的归一化2.1 公式2.2 代码实现2.3 代码调用 3. 可视化结果4. References 1. 目的 将卷积层(Convolution)、下采样层&#xff08;SubSampling&a…

Linux系统之安装Ward服务器监控工具

Linux系统之安装Ward服务器监控工具 一、Ward介绍1.1 Ward简介1.2 Ward特点 二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍 三、部署java环境3.1 jdk下载地址3.2 解压jdk安装包3.3 复制二进制文件3.4 配置环境编辑3.5 查看java版本 四、下载ward的jar包4.1 下载软件包4.2 …

阿里巴巴内部10w+字总结的Java面试题,全是面试官必问技术

献上熬夜整理最新“10w字总结的Java面试题&#xff08;附答案&#xff09;”够你刷&#xff01; 春招升级打怪拿offer&#xff0c;10w字总结的Java面试题&#xff08;附答案&#xff09;够你刷 其包含的内容模块有&#xff1a;基础、JVM、多线程与高并发、Spring、MyBatis、Spr…

APP自动化测试高级定位技巧,我敢打赌你一定不知道

目录 高阶定位-Xpath 包含-contains() XPath 轴 XPath 运算符 AND OR 高阶定位-CSS css selector 定位介绍 css selector 用法 示例 iOS css selector 定位 Toast 识别 Toast 是什么 Toast 定位 Toast 定位 显示等待 使用lambda表达式 总结三种等待方法 高阶定…

Ansible自动化运维工具之playbook剧本编写含lnmp

1.playbook的相关知识 1.1 playbook 的简介 playbook是 一个不同于使用Ansible命令行执行方式的模式&#xff0c;其功能更强大灵活。简单来说&#xff0c;playbook是一个非常简单的配置管理和多主机部署系统&#xff0c;不同于任何已经存在的模式&#xff0c;可作为一个适合部…

【黑马头条】解决P11@EnableDiscoveryClient注解无法导入爆红、bootstrap.yml配置文件图标无法显示成带云朵的小绿叶图标

本期目录 1. 问题描述2. 问题原因3. 解决方法 1. 问题描述 如果按黑马老师给的 heima-leadnews-service 模块的 pom 文件所写的依赖&#xff0c;会发现有 2 个 Bug &#xff1a; 首先&#xff0c;启动类 UserApplication 上的服务发现开关注解 EnableDiscoveryClient 不存在。 …

知识复盘(Session、Mysql、Servlet、Jsp、SSM)

一、会话跟踪技术(Session Tracking&#xff09; 1.为什么会出现会话机制? 目前主流的通讯方式就是客户端和服务端之间进行通信&#xff0c;而这种通信是通过Http协议实现的&#xff0c;但Http协议本身是无状态的&#xff0c;所以客户端每发送一次请求到服务器都会被当做一个…

windows上的Linux系统WSL2

目录 简介 安装 简介 适用于 Linux 的 Windows 子系统 (WSL) 可让开发人员直接在 Windows 上按原样运行 GNU/Linux 环境&#xff08;包括大多数命令行工具、实用工具和应用程序&#xff09;&#xff0c;且不会产生传统虚拟机或双启动设置开销&#xff0c;用于快速的多平台验…

Unity UGUI2——Canvas与EventSystem

一、Canvas ​ Canvas 的意思是画布&#xff0c;它是 UGUI 中所有 UI 元素能够被显示的根本&#xff0c;它主要负责渲染自己的所有 UI 子对象 ​ 如果 UI 控件对象不是 Canvas 的子对象&#xff0c;那么控件将不能被渲染 ​ 我们可以通过修改 Canvas 组件上的参数修改渲染方…

[架构之路-214]- UML-类图图解、详解、结构化、本质化讲解

目录 一、什么是类 1.1 概述 1.2 UML中类的表示 1.3 接口 1.4 抽象类 1.5 模板类 二、什么类图 2.1 概述 2.2 类关系 三、UML类图 3.1 结构关系 3.1.1 完全一体&#xff1a;继承关系 &#xff08;类与类耦合度最高&#xff0c;类与类之间最强的关系&#xff09; …