C语言【文件操作 2】

文章目录

  • 前言
  • 顺序读写函数的介绍
    • fputc && fgetc
      • fputc
      • fgetc
    • fputs && fgets
      • fputs
      • fgets
    • fprintf && fscanf
      • fprintf
      • fscanf
    • fwrite && fread
      • fwrite
      • fread
  • 文件的随机读写
    • fseek函数
    • 偏移量
    • ftell函数
    • rewind函数
  • 文件的结束判断
    • 被错误使用的feof
  • 结语

前言

在前面的文章我们讲解了文件操作的基础:点击此处浏览前文下面正式讲解文件的操作函数
注意:因为本章讲解的文件操作,所以大多数函数使用环境默认是文件!!!

顺序读写函数的介绍

函数名功能适用于
fgetc字符输⼊函数所有输入流
fputc字符输出函数所有输出流
fgets文本行输入函数所有输入流
fputs文本行输出函数所有输出流
fscanf格式化输⼊函数所有输入流
fprintf格式化输出函数所有输出流
fread⼆进制输⼊文件
fwrite二进制输出文件

上面说的适用与所有输入流一般指的是适用于标准输入流与其他输入流(例如文件输入流);所有输出流指的是适用于标准输出流与其他输出流(例如文件输出流)。

fputc && fgetc

fputc

将一个字符输出到文件

int fputc(int c, FILE* stream);

参数为什么是int类型呢?

因为传递的是ASCII码值

为什么会返回int类型的值呢?返回的是什么呢?
cpp网站是这样写的:

On success, the character written is returned.
If a writing error occurs, EOF is returned and the error indicator (ferror) is set.

大致意思就是:

如果写入成功,返回被写入的字符的ASCII码值
如果写入失败,返回EOF并设置错误提示符

例子:

#include<stdio.h>int main()
{FILE* pf = fopen("text.txt", "w");//只写if (pf == NULL){perror("fopen");//如果错误会在屏幕上打印错误原因}for (char c = 'A'; c <= 'Z'; c++){fputc(c, pf);//将字符输入到文件中}fclose(pf);pf = NULL;return 0;
}

在这里插入图片描述

fgetc

从文件中读取一个字符

int fgetc(FILE* stream)

返回的是ASCII码值

关于fgetc的返回值cpp网站是这样写的

On success, the character read is returned (promoted to an int value).
The return type is int to accommodate for the special value EOF, which indicates failure:
If the position indicator was at the end-of-file, the function returns EOF and sets the eof indicator (feof) of stream.
If some other reading error happens, the function also returns EOF, but sets its error indicator (ferror) instead.

大致意思是:

如果读取成功,返回被读取字符的ASCII码值;
若读取失败或文件光标已经到了文件末尾(就是没字符可以读了),则会返回EOF

例子:

#include<stdio.h>
int main()
{FILE* pf = fopen("text.txt", "r");//只读if (pf == NULL){perror("fopen");//如果错误会在屏幕上打印错误原因}int c;while ((c = fgetc(pf)) != EOF){printf("%c ", c);}fclose(pf);pf = NULL;return 0;
}

在这里插入图片描述

fputs && fgets

fputs

将字符串输出到文件

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

关于返回值

cpp网站是这样写的:

On success, a non-negative value is returned.
On error, the function returns EOF and sets the error indicator (ferror).

大致意思:

输出成功,返回一个非负数;
输出失败,返回EOF

例子:

#include<stdio.h>
int main()
{FILE* pf = fopen("text.txt", "w");//只写if (pf == NULL){perror("fopen");//如果错误会在屏幕上打印错误原因}char str[100] = "Hello World";fputs(str, pf);//数组名是数组首元素地址fclose(pf);pf = NULL;return 0;
}

在这里插入图片描述

fgets

读取指定位置范围内的字符串

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

str:用于接收字符串
num:一次读num-1个字符(fgets会默认在第num处存放’\0’)

关于返回值
cpp网站是这样写的:

On success, the function returns str.
If the end-of-file is encountered while attempting to read a character, the eof indicator is set (feof). If this happens before any characters could be read, the pointer returned is a null pointer (and the contents of str remain unchanged).
If a read error occurs, the error indicator (ferror) is set and a null pointer is also returned (but the contents pointed by str may have changed).

大致意思就是:

读取成功,返回str的地址;
读取失败或文件已到末尾,返回NULL;

例子:

#include<stdio.h>
int main()
{FILE* pf = fopen("text.txt", "r");//只读if (pf == NULL){perror("fopen");//如果错误会在屏幕上打印错误原因return;}char buf1[100] = { 0 };char* str1;str1 = fgets(buf1, 12, pf);//这是我明确知道文件有多少个元素printf("明确知道:");printf("%s", str1);printf("\n");rewind(pf);//将光标返回文件初始位置//假设我们不知道文件内有多少个元素char buf2[100] = { 0 };char* str2;printf("并不明确:");while ((str2 = fgets(buf2, 2, pf)) != NULL){printf("%s", str2);}fclose(pf);pf = NULL;return 0;
}

在这里插入图片描述

fprintf && fscanf

fprintf

将数据以格式化的形式输出到文件

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

fprintfprintf很像,只是printf是输出到标准输出流(屏幕);而·printf是可以输出到指定输出流中

例子:

#include<stdio.h>
typedef struct st
{char _Name[20];int _Score;char _SId[17];
}Stu;int main()
{Stu student = { "zhangsan" , 99, "202300002024" };FILE* pf = fopen("text.txt", "w");//只写if (pf == NULL){perror("fopen");//如果错误会在屏幕上打印错误原因}fprintf(pf, "%s %d %s", student._Name, student._Score, student._SId);fclose(pf);pf = NULL;return 0;
}

在这里插入图片描述

fscanf

从文件输出格式化的数据

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

同理,fscanfscanf也是很相似的;只不过scanf是从标准输入流(键盘)得到数据,fscanf是从指定的输入流中得到数据

例子:

#include<stdio.h>
typedef struct st
{char _Name[20];int _Score;char _SId[17];
}Stu;int main()
{FILE* pf = fopen("text.txt", "r");//只读if (pf == NULL){perror("fopen");//如果错误会在屏幕上打印错误原因}Stu x = { 0 };fscanf(pf, "%s %d %s", x._Name, &(x._Score), x._SId);printf("%s %d %s", x._Name, x._Score, x._SId);fclose(pf);pf = NULL;return 0;
}

在这里插入图片描述
注意:上面的函数可以使用到任意的指定流中;
当然也要遵守语法:该是输出流给输出流,该是输入流给输入流

就拿fprintf举例

#include<stdio.h>
typedef struct st
{char _Name[20];int _Score;char _SId[17];
}Stu;
int main()
{Stu student = { "zhangsan" , 99, "202300002024" };FILE* pf = fopen("text.txt", "w");//只写if (pf == NULL){perror("fopen");//如果错误会在屏幕上打印错误原因}fprintf(stdout, "%s %d %s", student._Name, student._Score, student._SId);//stdout是标准输出流fclose(pf);pf = NULL;return 0;
}

在这里插入图片描述

fwrite && fread

这两个函数只能用文件流(也就是只能输入输出到文件)

fwrite

以二进制的形式输出数据到文件(只能输入到文件)

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

ptr->要输入的数据
size->数据的大小
count->数据的个数

例子:

#include<stdio/h>
int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };FILE* pf = fopen("text.txt", "wb");//只写(以二进制形式)if (pf == NULL){perror("fopen");//如果错误会在屏幕上打印错误原因}fwrite(arr, sizeof(arr[0]), 10, pf);fclose(pf);pf = NULL;return 0;
}

在这里插入图片描述

fread

以二进制的形式从文件中读取数据

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

ptr->用于接收数据
size->数据的大小
count->数据的个数

关于返回值

cpp网站是这样写的

The total number of elements successfully read is returned.
If this number differs from the count parameter, either a reading error occurred or the end-of-file was reached while reading. In both cases, the proper indicator is set, which can be checked with ferror and feof, respectively.
If either size or count is zero, the function returns zero and both the stream state and the content pointed by ptr remain unchanged.
size_t is an unsigned integral type.

大致意思为:

如果读取成功,返回成功读取的元素个数。
如果这个数字与 count 参数不同,要么是发生了读取错误,要么是在读取过程中到达了文件终点。
如果 size 或 count 均为零,函数返回零,流状态和 ptr 指向的内容均保持不变。

例子:

#include<stdio.h>int main()
{FILE* pf = fopen("text.txt", "rb");//只读(以二进制形式)if (pf == NULL){perror("fopen");//如果错误会在屏幕上打印错误原因}int arr[10] = { 0 };fread(arr, sizeof(arr[0]), 10, pf);for (int i = 0; i < 10; i++){printf("%d ", arr[i]);}fclose(pf);pf = NULL;return 0;
}

在这里插入图片描述

文件的随机读写

fseek函数

根据文件指针的位置和偏移量来定位文件指针。

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

偏移量

文件指针所指向的位置距离文件起始位置有多少个数据

文件起始位置有三种(下列表格在cpp网站的fseek函数中)

ConstantReference position
SEEK_SETBeginning of file
SEEK_CURCurrent position of the file pointer
SEEK_ENDEnd of file *

SEEK_SET:文件的开始位置
SEEK_CUR:文件指针当前的位置
SEEK_END:文件的末尾
如果fseek给的起始位置是SEEK_END,那么访问前面的元素,偏移量就要给负数

例子:

#include<stdio.h>
int main()
{FILE* pFile;pFile = fopen("text.txt", "w");fputs("This is an apple.", pFile);fseek(pFile, 9, SEEK_SET);fputs(" sam", pFile);fclose(pFile);return 0;
}

在这里插入图片描述
在这里插入图片描述
这是为什么呢?
我们来看图吧。
在这里插入图片描述

ftell函数

返回文件指针相对于起始位置的偏移量

long int ftell ( FILE * stream );

例子:

#include<stdio.h>
int main()
{FILE* pf = fopen("text.txt", "r");//只读if (pf == NULL){perror("fopen");//如果错误会在屏幕上打印错误原因}for (int i = 0; i < 5; i++){fgetc(pf);}printf("偏移量为%d ",ftell(pf));fclose(pf);pf = NULL;return 0;
}

在这里插入图片描述

rewind函数

让文件指针返回到文件的起始位置

void rewind ( FILE * stream );

前面的例子也使用过:

#include<stdio.h>
int main()
{FILE* pf = fopen("text.txt", "r");//只读if (pf == NULL){perror("fopen");//如果错误会在屏幕上打印错误原因return;}char buf1[100] = { 0 };char* str1;str1 = fgets(buf1, 18, pf);//这是我明确知道文件有多少个元素printf("明确知道:");printf("%s", str1);printf("\n");rewind(pf);//将光标返回文件初始位置//假设我们不知道文件内有多少个元素char buf2[100] = { 0 };char* str2;printf("并不明确:");while ((str2 = fgets(buf2, 2, pf)) != NULL){printf("%s", str2);}fclose(pf);pf = NULL;return 0;
}

在这里插入图片描述

文件的结束判断

被错误使用的feof

牢记:在文件读取的过程中,不能用feof函数的返回值来直接判断文件是否结束。
feof的作用是:当文件已经读取结束时,判断结束的原因是否为“遇到文件尾部结束”。

文本文件读取是否结束。判断返回值是否为EOF (fgetc),或NULL(fgets)。
二进制文件读取是否结束,判断返回值是否小于实际要读的数。

cpp的网站->https://cplusplus.com/

结语

最后感谢您能阅读完此片文章,如果有任何建议或纠正欢迎在评论区留言。如果您认为这篇文章对您有所收获,点一个小小的赞就是我创作的巨大动力,谢谢!!!

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

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

相关文章

【2024版】最新6款漏洞扫描工具来了!(附下载)看完这一篇就够了

目录 一、Nessus 二、AWVS 三、ZAP 四、w3af 五、北极熊 六、御剑 七、网络安全学习路线 &#xff08;2024最新整理&#xff09; 八、学习资料的推荐 1.视频教程 2.SRC技术文档&PDF书籍 3.大厂面试题 特别声明&#xff1a; 渗透测试收集信息完成后&#xf…

《ESP8266通信指南》11-Lua开发环境配置

往期 《ESP8266通信指南》10-MQTT通信&#xff08;Arduino开发&#xff09;-CSDN博客 《ESP8266通信指南》9-TCP通信&#xff08;Arudino开发&#xff09;-CSDN博客 《ESP8266通信指南》8-连接WIFI&#xff08;Arduino开发&#xff09;&#xff08;非常简单&#xff09;-CSD…

AI换脸原理(3)——人脸对齐介绍

人脸对齐简介 人脸对齐其实包含两个步骤:人脸关键点检测、人脸对齐,英文术语有facial landmark和face alignment,主要用于精确标识眉毛、眼睛、鼻子、嘴巴以及人脸轮廓等特征部位。不同数据集对于关键点的数量有不同的设定,最少的是标记5个关键点,通常包括两只眼睛的瞳孔…

【driver5】调用堆栈函数,printk,动态打印,ftrace,proc,sysfs

文章目录 1.内核函数调用堆栈&#xff1a;4个函数2.printk&#xff1a;cat /proc/cmdline查看consolettyS03.动态打印&#xff1a;printk是全局的且只能设打印等级&#xff0c;动态打印可控制选择模块的打印&#xff0c;在内核配置打开CONFIG_DYNAMIC_DEBUG4.top&perf&…

mac 本地使用docker 运行es,kibana

1.下载 m芯片一些版本不支持.踩过坑.翻看官网才知道只有部分镜像支持m芯片 https://hub.docker.com/添加链接描述 docker pull elasticsearch:7.17.21 docker pull kibana:7.17.21镜像已经下载下来了 2.创建文件映射-挂载 /Users/lin/dev/dockerMsg 其中lin是自己的用户名…

2024年软件测试最全jmeter做接口压力测试_jmeter接口性能测试_jmeter压测接口(3),【大牛疯狂教学

既有适合小白学习的零基础资料&#xff0c;也有适合3年以上经验的小伙伴深入学习提升的进阶课程&#xff0c;涵盖了95%以上软件测试知识点&#xff0c;真正体系化&#xff01; 由于文件比较多&#xff0c;这里只是将部分目录截图出来&#xff0c;全套包含大厂面经、学习笔记、…

JavaWeb_请求响应_简单参数实体参数

一、SpringBoot方式接收携带简单参数的请求 简单参数&#xff1a;参数名与形参变量名相同&#xff0c;定义形参即可接收参数。并且在接收过程中&#xff0c;会进行自动的类型转换。 启动应用程序后&#xff0c;在postman中进行测试&#xff1a; 请求成功&#xff0c;响应回了O…

【Ping】Windows 网络延迟测试 ping 、telnet、tcping 工具

ping 命令 属于网络层的ICMP协议&#xff0c;只能检查 IP 的连通性或网络连接速度&#xff0c; 无法检测IP的端口状态。 telnet telnet命令&#xff0c;属于应用层的协议&#xff0c;用于远程登录&#xff0c;也可用于检测IP的端口状态。但是功能有限&#xff0c;只能检测一时…

八股文(C#篇)

C#中的数值类型 堆和栈 值类型的数据被保存在栈&#xff08;stack)上&#xff0c;而引用类型的数据被保存在堆&#xff08;heap&#xff09;上&#xff0c;当值类型作为参数传递给函数时&#xff0c;会将其复制到新的内存空间中&#xff0c;因此在函数中对该值类型的修改不会影…

华为eNSP Pro模拟器下载(普通账号可用)

好消息&#xff01;华为终于开放了普通账号使用权限&#xff01; 安装教程下载后见《指导手册-eNSP Pro V100R001C00.pdf》 华为eNSP Pro模拟器下载&#xff08;普通账号可用&#xff09; 下载地址 华为eNSP Pro模拟器下载&#xff08;普通账号可用&#xff09; - 下一朵云 …

Linux进程间通信方式

每个进程的用户空间都是独立的&#xff0c;不能相互访问。 所有进程的内核空间(32位系统3G-4G)都是共享的 应用场景 作为缓冲区&#xff0c;处理速度不同的进程之间的数据传输资源共享&#xff1a;多个进程之间共享同样的资源&#xff0c;一个进程对共享数据的修改&#xff0c…

大数据Scala教程从入门到精通第五篇:Scala环境搭建

一&#xff1a;安装步骤 1&#xff1a;scala安装 1&#xff1a;首先确保 JDK1.8 安装成功: 2&#xff1a;下载对应的 Scala 安装文件 scala-2.12.11.zip 3&#xff1a;解压 scala-2.12.11.zip 4&#xff1a;配置 Scala 的环境变量 在Windows上安装Scala_windows安装scala…

RK3568 学习笔记 : u-boot 下通过设置 env ethact 设置当前工作的以太网设备

前言 正点原子 &#xff1a;RK3568 开发板 atompi-ca1 默认有两个网口&#xff0c;通过 u-boot mii 命令&#xff0c;可以查看 网口信息 > mii device MII devices: ethernetfe010000 ethernetfe2a0000 Current device: ethernetfe010000u-boot 下的以太网&#xff0c;不同…

昂科烧录器支持O2Micro凹凸科技的电池组管理IC OZ7708

芯片烧录行业领导者-昂科技术近日发布最新的烧录软件更新及新增支持的芯片型号列表&#xff0c;其中O2Micro凹凸科技的电池组管理IC OZ7708已经被昂科的通用烧录平台AP8000所支持。 OZ7708是一款高度集成、低成本的电池组管理IC&#xff0c;适用于5~8s Li-Ion/Polymer电池组&a…

C++从入门到入土(二)——初步认识类与对象

目录 前言 类与对象的引入 类的定义 类的访问限定符及封装 访问限定符&#xff1a; 封装&#xff1a; 类的作用域 类的实例化 类的大小 this指针 this指针的特性 前言 各位佬们&#xff0c;在开始本篇文章的内容之前&#xff0c;我想先向大家道个歉&#xff0c;由于…

Unity数据持久化之XML

目录 数据持久化XML概述XML文件格式XML基本语法XML属性 C#读取存储XMLXML文件存放位置C#读取XML文件C#存储XML文件 实践小项目必备知识点XML序列化&#xff08;不支持字典&#xff09;XML反序列化IXmlSerializable接口让Dictionary支持序列化反序列化 数据持久化XML概述 什么是…

Unity数据持久化之Json

目录 Json概述Json文件格式Json配置规则Excel转Json C#读取存储Json文件JsonUtlityJsonUtlity序列化JsonUtility反序列化 LitJsonLitJson序列化LitJson反序列化JsonUtility和LitJson对比 Json概述 Json是什么? 全称:JavaScript对象简谱(JavaScript Object Notation) Json是国…

修改表空间的状态

Oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 表空间有4种状态:联机、脱机、只读和读写。修改其中某一种状态的语句如下所示 设置表空间 tspace 为联机状态。 SQL>ALTER TABLESPACE space ONLINE: 设置表空间 tspa…

【触摸案例-手势解锁案例-按钮高亮 Objective-C语言】

一、我们来说这个self.btns,这个问题啊,为什么不用_btns, 1.我们说,在懒加载里边儿,经常是写下划线啊,_btns,为什么不写,首先啊,这个layoutSubviews:我们第一次,肯定会去执行这个layoutSubviews: 然后呢,去懒加载这个数组, 然后呢,接下来啊,走这一句话, 第一次…

C语言数据在内存中的存储

C语言数据在内存中的存储 个人主页&#xff1a;大白的编程日记 个人专栏&#xff1a;C语言学习之路 文章目录 C语言数据在内存中的存储前言一.整数在内存中的存储1.1整数的表示形式1.2整数在内存中的存放 二.大小端字节序和字节序判断2.1大小端的概念2.2为什么有大小端 三.练习…