C语言-常见文件操作函数详解(fgetc,fputc,fgets,fputs,fscanf,fprintf,fread,fwrite)

在这里插入图片描述

 🌏个人博客:尹蓝锐的博客

在这里插入图片描述

希望文章能够给到初学的你一些启发~ 如果觉得文章对你有帮助的话,点赞 + 关注+ 收藏支持一下笔者吧~

顺序读写数据常用函数

函数名调用形式功能返回值
fgetcfgetc(fp)从指针变量fp指向的文件中读入一个字符读成功,返回所读字符,失败返回EOF(即-1)
fputcfputc(fp)把字符ch写到文件指针变量fp所指向的文件中输出成功返回值就是输出的字符,输出失败返回EOF(即-1)
fgetsfgets(str,n,fp)

从fp指向的文件读入一个长度为(n-1)的字符串,存放到字符数组str中

tips:读n-1个是因为fgets函数要固定留一个字符 '\0' 作为字符串结束标志

读成功,返回地址str,失败则返回NULL
fputsfputs(str,fp)

把str所指向的字符串写到文件指针变量fp所指向的文件中

输出成功,返回0;否则返回非0值
fscanffscanf(fp,"%d",i)将int类型变量i的值按照%d的格式输出到fp指向的文件中成功后,将返回写入的字符总数。否则并返回负数。
fprintffprintf(fp,"%f",j)将float类型的变量j的值按照%f的格式输出到屏幕上成功后,将返回写入的字符总数。否则并返回负数。

fread

fread(buffer,size,count,fp)从fp中读取一个含有count个元素的数组,每个元素的大小为size个字节,并将其存储在buffer指定的内存块中。返回成功读取的元素总数
fwritefwrite(buffer,size,count,fp)从buffer指向的内存块向文件流中写入一个包含count个元素数组,每个元素的大小为size个字节。流的位置指示器按写入的总字节数前进。返回成功写入的元素总数。

1、fgetc

int fgetc ( FILE * stream );

  1. 从流中获取字符
  2. 返回指定流的内部文件位置指示符当前指向的字符。然后,内部文件位置指示器将前进到下一个字符。
  3. 如果调用时流位于文件末尾,则函数返回EOF并为流设置文件末尾指示符(feof)。
  4. 如果发生读取错误,该函数将返回EOF并为流设置错误指示符(ferror)。
  5. fgetc和getc是等效的,除了getc可以在某些库中实现为宏。

为了更加具体理解,我们创建一个文件并输入一些字符

 在保证文件有内容可读取后,我们以只读的方式打开文件,使用ch变量挨个读取文件中的字符

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	FILE *fp = fopen("test.txt", "r");
	if (fp == NULL)
	{
		perror("fopen");
		return 1;
	}
	char ch = getc(fp);
	printf("%c", ch);
	ch = getc(fp);
	printf("%c", ch);
	fclose(fp);
	fp = NULL;
	return 0;
}

运行结果如下:

2、fputc

int fputc ( int character, FILE * stream );

  1. 向流写入字符将字符写入流并推进位置指示器。
  2. 字符被写在流的内部位置指示器指示的位置,然后自动前进一个。

使用fputc向文件中挨个写入字符

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	FILE *fp = fopen("test.txt", "w");//只写方式打开
	if (fp == NULL)
	{
		perror("fopen");
		return 1;
	}
	char ch[10] = "excellent!";
	for (int i = 0; i < 10; i++)
	{
		fputc(ch[i], fp);
	}
	fclose(fp);
	fp = NULL;
	return 0;
}

运行结果如下,test被成功写入字符

这里需要注意的是:如果test.txt文件中本来有内容,原来的内容会被清空

3、fgets

char * fgets ( char * str, int num, FILE * stream );

  1. 从流中获取字符串
  2. 从流中读取字符,并将其作为字符串存储到str中,直到读取了(num-1)个字符,或者到达换行符或文件末尾,以先发生者为准。
  3. 换行符会使fgets停止读取,但函数会将其视为有效字符,并将其包含在复制到str的字符串中。
  4. 在复制到str的字符之后,会自动附加一个终止空字符。
  5. 请注意,fgets与gets有很大不同:fgets不仅接受流参数,还允许指定str的最大大小,并在字符串中包含任何换行符。

确保test.txt文件有内容的情况下,用只读方式打开文件

通过fgets函数获取文件中的字符串并将其保存至字符数组ch中,代码如下

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	FILE *fp = fopen("test.txt", "r");//只读方式打开
	if (fp == NULL)
	{
		perror("fopen");
		return 1;
	}
	char ch[10];
	fgets(ch, sizeof(ch), fp);
	puts(ch);
	fclose(fp);
	fp = NULL;
	return 0;
}

运行结果如下

我们需要注意的是本代码调用fgets函数时,第二个参数使用sizeof(ch),计算字符数组ch所占字节数,计算结果值为10,而fgets函数第二个参数代表取10-1个,即9个字符,所以文件中只有9个字符被存入字符数组ch中,原本文件内容excellent后的  !没有被输出

4、fputs

int fputs ( const char * str, FILE * stream );

  1. 将字符串写入流
  2. 将str指向的字符串写入流。
  3. 函数从指定的地址(str)开始复制,直到到达终止的空字符(“\0”)。此终止空字符不会复制到流中。
  4. 请注意,fputs与put的不同之处不仅在于可以指定目标流,而且fputs不会写入额外的字符,而put会自动在末尾添加换行符。

通过fputs函数向文件中写入字符串

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	FILE *fp = fopen("test.txt", "w");//只写方式打开
	if (fp == NULL)
	{
		perror("fopen");
		return 1;
	}
	char ch[11]="wonderful!";
	fputs(ch,fp);

	fclose(fp);
	fp = NULL;
	return 0;
}

运行结果如下:

5、fscanf

int fscanf ( FILE * stream, const char * format, ... );
  1. 从流中读取格式化数据
  2. 从流中读取数据,并根据参数格式将其存储到附加参数指向的位置。
  3. 附加参数应指向格式字符串中由其相应格式说明符指定的类型的已分配对象。

首先保证test.txt文件中有内容

使用scanf用格式化的方式读取文件中的内容,代码如下

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	FILE *fp = fopen("test.txt", "r");//只写方式打开
	if (fp == NULL)
	{
		perror("fopen");
		return 1;
	}
	int n;
	fscanf(fp, "%d", &n);
	printf("%d", n);
	fclose(fp);
	fp = NULL;
	return 0;
}

运行结果如下

6、fprintf

int fprintf ( FILE * stream, const char * format, ... );
  1. 将格式化数据写入流
  2. 将按格式指向的字符串写入流。如果format包含格式说明符(以%开头的子序列),则格式化format之后的其他参数并将其插入到结果字符串中,替换其各自的说明符。
  3. 在format参数之后,函数需要至少与format指定的额外参数一样多的参数。

使用fprintf函数向文件中格式化输出内容

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	FILE *fp = fopen("test.txt", "w");//只写方式打开
	if (fp == NULL)
	{
		perror("fopen");
		return 1;
	}
	int n = 123456;
	fprintf(fp, "%d", n);
	
	fclose(fp);
	fp = NULL;
	return 0;
}

运行结果如下:

7、fread

size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );
  1. 从流中读取数据块
  2. 从流中读取一个count个元素组成的数组,每个元素的大小为size个字节,并将其存储在ptr指定的内存块中。
  3. 流的位置指示器按读取的总字节数前进。
  4. 如果成功,读取的字节总数为(size(大小)*count(计数))。

该函数一共有4个参数:

  1. ptr指向大小至少为(大小*计数)字节的内存块的指针,转换为void*。
  2. size要读取的每个元素的大小(以字节为单位)。
  3. size_t是一个无符号整数类型。
  4. count元素的数量,每个元素的大小为字节。
  5. size_t是一个无符号整数类型。
  6. stream指向指定输入流的FILE对象的指针。

首先保证test.dat该二进制文件中有数据,我这里给的是123456,可将test.txt中输入数据后修改文件名成.dat

使用fread函数从二进制文件中读入数据存入字符数组arr中,并输出

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	FILE *fp = fopen("test.dat", "rb");//只读方式打开,且读的是二进制文件
	if (fp == NULL)
	{
		perror("fopen");
		return 1;
	}
	char arr[7] = { 0 };
	fread(arr, sizeof(arr[0]), sizeof(arr), fp);
	printf("%s", arr);
	// arr : 将文件读取到内存的位置
	// sizeof(arr[0]) : 读取的元素字节大小
	// sizeof(arr) : 读取元素的个数,
	// 读取字节个数是 sizeof(arr) * sizeof(arr[0])
	// fp : 文件指针
	fclose(fp);
	fp = NULL;
	return 0;
}

运行结果如下:

8、fwirte

size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );
  1. 将数据块写入流
  2. 从ptr指向的内存块向流中的当前位置写入含有count个元素的数组,每个元素的大小为size字节
  3. 流的位置指示器按写入的总字节数前进。
  4. 在内部,该函数将ptr指向的块解释为一个无符号char类型的(大小*计数)元素数组,并将它们顺序写入流,就像每个字节都调用了fputc一样。

本函数由4个参数(与fread类似)

  1. ptr指向要写入的元素数组的指针,转换为const void*。
  2. size要写入的每个元素的大小(以字节为单位)。
  3. size_t是一个无符号整数类型。
  4. count元素的数量,每个元素的大小为字节。
  5. size_t是一个无符号整数类型。
  6. stream指向指定输出流的FILE对象的指针。

我们使用fwirte函数向二进制文件test.dat写入字符串hello,操作如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	FILE *fp = fopen("test.dat", "wb");//只写方式打开,且写的是二进制文件
	if (fp == NULL)
	{
		perror("fopen");
		return 1;
	}
	char arr[7] = { "hello" };
	fwrite(arr, sizeof(arr[0]), sizeof(arr), fp);
	// arr : 将文件读取到内存的位置
	// sizeof(arr[0]) : 读取的元素字节大小
	// sizeof(arr) : 读取元素的个数,
	// 读取字节个数是 sizeof(arr) * sizeof(arr[0])
	// fp : 文件指针
	fclose(fp);
	fp = NULL;
	return 0;
}

检验:将test.dat后缀改成txt文件,打开发现更改成功

  如果我的博客能给您带来启发,请不吝点赞、评论和收藏,也欢迎您关注我的博客。

  如果你喜欢这篇文章,别忘了留下你的感想和建议,让我知道你的想法。同时,也请继续关注我的博客,我们不见不散!

  最后,愿每一位读到这里的你,都能拥有一个充实而美好的每一天。不管世界怎样变化,保持学习,保持热爱,保持对生活的好奇心,我们的故事,还在继续……

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

(五)Proteus仿真STM32单片机串口数据流收发

&#xff08;五&#xff09;Protues仿真STM32单片机串口数据流收发 – ARMFUN 1&#xff0c;打开STM32CubeMX&#xff0c;找到USART1,配置模式Asynchronous&#xff0c;此时PA9、PA10自动变成串口模式 串口默认参数:115200bps 8bit None 1stop 2&#xff0c;NVIC Settings使能…

Kafka之基本概念

1、Kafka是什么&#xff1f; Kafka是由Scala语言开发的一个多分区、多副本&#xff0c;基于Zookeeper集群协调的系统。 那这个所谓的系统又是什么系统呢&#xff1f; 回答这个问题要从发展的角度来看&#xff1a;起初Kafka的定位是分布式消息系统。但是目前它的定位是一个分布…

Pr 视频效果:元数据和时间码刻录

视频效果/视频/元数据和时间码刻录 Video/Metadata & Timecode Burn-in 元数据和时间码刻录 Metadata & Timecode Burn-in效果是一种在视频画面上叠加显示剪辑元数据或时间码的工具。它允许在导出视频时&#xff0c;将需用的元数据信息直接刻录在画面上&#xff0c;方便…

Linux操作系统小项目——实现《进程池》

文章目录 前言&#xff1a;代码实现&#xff1a;原理讲解&#xff1a;细节处理&#xff1a; 前言&#xff1a; 在前面的学习中&#xff0c;我们简单的了解了下进程之间的通信方式&#xff0c;目前我们只能知道父子进程的通信是通过匿名管道的方式进行通信的&#xff0c;这是因…

MacOS编译和安装Poco库的方法

1.从官网git下载最新的poco源代码 在/usr/local路径下创建Poco文件夹&#xff0c;克隆Poco源代码 sudo git clone -b poco-1.13.3-release https://github.com/pocoproject/poco.git2.等了一会后&#xff0c;报错啦&#xff01;&#xff01;&#xff01; error: RPC failed…

Unity3D 单例模式

Unity3D 泛型单例 单例模式 单例模式是一种创建型设计模式&#xff0c;能够保证一个类只有一个实例&#xff0c;提供访问实例的全局节点。 通常会把一些管理类设置成单例&#xff0c;例如 GameManager、UIManager 等&#xff0c;可以很方便地使用这些管理类单例&#xff0c;…

<Project-8 pdf2tx-MM> Python Flask应用:在浏览器中翻译PDF文件 NLTK OCR 多线程 指定翻译器 改进后的P6

项目概述 名字解释 缩写&#xff1a; pdf2tx-MM pdf file transfer to text content with Multi-threads and Multi-translators pdf2tx-MM 是一个基于 Flask 的 Web 应用程序&#xff0c;提供将 PDF 文件中的内容提取、翻译并展示。使用者上传 PDF 文件&#xff0c;应用程序…

计算机视觉之OpenCV vs YOLO

好多开发者希望搞明白OpenCV 和YOLO区别&#xff0c;实际上&#xff0c;二者在计算机视觉领域都有广泛应用&#xff0c;但它们有很大的不同。 一、OpenCV 概述 OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉和机器学习软件库。它…

Cherno游戏引擎笔记(61~72)

---------------一些维护和更改------------- 》》》》 Made Win-GenProjects.bat work from every directory 代码更改&#xff1a; echo off->pushd ..\->pushd %~dp0\..\call vendor\bin\premake\premake5.exe vs2019popdPAUSE 为什么要做这样的更改&#xff1f; …

20年408数据结构

第一题&#xff1a; 解析&#xff1a;这种题可以先画个草图分析一下&#xff0c;一下就看出来了。 这里的m(7,2)对应的是这图里的m(2,7),第一列存1个元素&#xff0c;第二列存2个元素&#xff0c;第三列存3个元素&#xff0c;第四列存4个元素&#xff0c;第五列存5个元素&#…

云栖实录 | 大模型驱动,开源融合的 AI 搜索产品发布

本文根据2024云栖大会实录整理而成&#xff0c;演讲信息如下&#xff1a; 演讲人&#xff1a; 郭瑞杰 | 阿里云智能集团资深技术专家&#xff0c;阿里云 AI 搜索负责人 邹 宽&#xff5c;阿里云智能集团高级产品专家&#xff0c;阿里云 AI 搜索产品负责人 活动&#xff1a;…

【EXCEL数据处理】000021 案例 保姆级教程,附多个操作案例。EXCEL文档安全性设置。

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 【EXCEL数据处理】000021 案例 保姆级教程&#xff0c;附多个操作案例。…

【套路揭秘】新手如何一步跃升至管理层

&#x1f525;禅道AI功能让企业实现人工智能的自然接入&#xff0c;助力企业开启高效办公新阶段。 ✅AI 提词 通过AI一键提词&#xff0c;可灵活设计项目流程需要的AI提词&#xff0c;实现人工智能无缝融入产品研发流程&#xff0c;提高软件研发过程效率。 &#x1f4a1;需求…

uniapp打包安卓apk步骤

然后安装在手机上就可以啦

Apache DolphinScheduler-1.3.9源码分析(二)

引言 随着大数据的发展&#xff0c;任务调度系统成为了数据处理和管理中至关重要的部分。Apache DolphinScheduler 是一款优秀的开源分布式工作流调度平台&#xff0c;在大数据场景中得到广泛应用。 在本文中&#xff0c;我们将对 Apache DolphinScheduler 1.3.9 版本的源码进…

基于FPGA的ov5640摄像头图像采集(二)

之前讲过ov5640摄像头图像采集&#xff0c;但是只包了的摄像头驱动与数据对齐两部分&#xff0c;但是由于摄像头输入的像素时钟与HDMI输出的驱动时钟并不相同&#xff0c;所有需要利用DDR3来将像素数据进行缓存再将像素数据从DDR3中读出&#xff0c;对DDR3的读写参考米联客的IP…

JVM系列(二) -类的加载过程介绍

一、背景介绍 我们知道 Java 是先通过编译器将.java类文件转成.class字节码文件&#xff0c;然后再通过虚拟机将.class字节码文件加载到内存中来实现应用程序的运行。 那么虚拟机是什么时候加载class文件&#xff1f;如何加载class文件&#xff1f;class文件进入到虚拟机后发…

Python酷库之旅-第三方库Pandas(142)

目录 一、用法精讲 641、pandas.Timestamp.hour属性 641-1、语法 641-2、参数 641-3、功能 641-4、返回值 641-5、说明 641-6、用法 641-6-1、数据准备 641-6-2、代码示例 641-6-3、结果输出 642、pandas.Timestamp.is_leap_year属性 642-1、语法 642-2、参数 6…

【MySQL 08】复合查询

目录 1.准备工作 2.多表查询 笛卡尔积 多表查询案例 3. 自连接 4.子查询 1.单行子查询 2.多行子查询 3.多列子查询 4.在from子句中使用子查询 5.合并查询 1.union 2.union all 1.准备工作 如下三个表&#xff0c;将作为示例&#xff0c;理解复合查询 EMP员工表…

在IDEA里用XDebug调试PHP,断点....

做程序开发,调试必不可少,这里最近用到了PHP,顺便写个关于PHP的调试安装使用: 1、首先是PHP先安装xdebug扩展(还有zend的),这个我的工具是IDEA,所以安装方法也相对简单,如果你是用VSCode等应该也是一样,如下图,找到这个PHP->DEBUG 2、直接点上面的Install XDebug 就可以帮你…