文件操作(顺序读写篇)

1. 顺序读写函数一览

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

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

建议先看文件操作(基础知识篇)-CSDN博客


2. fgetc和fputc

2.1 fgetc

该函数可以从流中读取字符。

当读取成功时 ,返回所读到字符的ASCLL码值;当读取失败时(遇到文件末尾或发生其他错误),返回EOF。

由于EOF的类型为int,所以,为了适应这个特殊的返回值,函数的返回类型为int。

使用示例:

#include <stdio.h>
#include <string.h>
#include <errno.h>int main()
{FILE* pf = fopen("test.txt", "r");if(pf == NULL){printf("%s\n", strerror(errno));//perror("fopen");return 1;}//读文件(字符)int ch = fgetc(pf);//发生错误时返回EOFprintf("%c\n", ch);//读一个字符while((ch = fgetc(pf)) != EOF)//直到读到文件末尾{printf("%c\n", ch);}//关闭文件fclose(pf);pf = NULL;return 0;
}

2.2 fputc

该函数可以将字符输入到流中。

当写入成功时,返回所写入的字符的ASCLL码值;当写入失败时,返回EOF。

同样,该函数的返回值为int。

第一个参数character传入时的类型为int,但是在函数内部,该参数会被转化为unsigned char类型。 

使用示例:

#include <stdio.h>
#include <string.h>
#include <errno.h>int main()
{FILE* pf = fopen("test.txt", "w");//写文件时,文件中的数据会被全部清空,不想清除用"a"if(pf == NULL){printf("%s\n", strerror(errno));return 1;}//写文件(字符)char i = 0;for(i = 'a';i <= 'z';i++)//将字符'a'到'z'写入文件{fputc(i, pf);}fclose(pf);pf = NULL;return 0;
}

3. fgets和fputs

3.1 fgets

该函数可以从流中读取字符串。

第一个参数str是存放读取到的字符串的地址,第二个参数num限制最多可读取字符的数量。

当读取成功时(读取到至少一个字符且为发生错误),返回str;当读取失败时(没有读取到任何字符或发生错误),返回NULL且str的内容保持不变。

注意,函数实际能读取的字符数量的最大值为num-1,因为还有一个是'\0'。

使用示例:

#include <stdio.h>
#include <string.h>
#include <errno.h>int main()
{FILE* pf = fopen("test.txt", "r");if(pf == NULL){printf("%s\n", strerror(errno));return 1;}char arr[20];fgets(arr, 10, pf);//数组,最多读取个数(读取到的字符为i-1,最后一个是\0),文件指针//返回值为字符串地址,失败时返回NULLprintf("%s\n", arr);//关闭文件fclose(pf);pf = NULL;return 0;
}

3.2 fputs

该函数可以将字符串写入流中。

当写入成功时,返回一个非负数;当写入失败时,返回EOF。

使用示例:

#include <stdio.h>
#include <string.h>
#include <errno.h>int main()
{FILE* pf = fopen("test.txt", "w");if(pf == NULL){printf("%s\n", strerror(errno));return 1;}fputs("hello world", pf);//换行加\n//关闭文件fclose(pf);pf = NULL;return 0;
}

 

4. fscanf和fprintf

4.1 fscanf

该函数可以从流中读取格式化数据。

可以看到,该函数与scanf的差别在于多了一个参数stream。

scanf针对于标准输入流(对于windows操作系统来说,就是指键盘)进行读取,而fscanf可以从任意输入流中进行读取。

当传入的第一个参数为stdin(标准输入流)时,两函数的作用相同 。

当读取成功时(至少读取到一个格式化数据),返回读取到格式化数据的个数;当读取失败时(在读取到任何数据之前就发生了错误或遇到文件末尾),返回EOF。

使用示例:

#include <stdio.h>
#include <string.h>
#include <errno.h>struct S
{char arr[10];int age;float score;
};int main()
{struct S s = {0};FILE* pf = fopen("test.txt", "r");if(pf == NULL){perror("fopen");return 1;}//读取文件fscanf(pf, "%s %d %f", s.arr, &(s.age), &(s.score));printf("%s %d %f\n", s.arr, s.age, s.score);//关闭文件fclose(pf);pf = NULL;return 0;
}

4.2 fprintf

该函数可以向流中写入格式化数据。

 同样,该函数相比于printf,多了一个参数stream。

printf针对于标准输出流(对于windows操作系统来说,就是指运行框)进行输出(写入),而fprintf可以将数据写入任意流中。

当传入的第一个参数为stdout(标准输出流)时,两函数的作用相同。

当写入成功时,返回写入数据的个数;当写入失败时(发生错误),返回一个负数。

使用示例:

#include <stdio.h>
#include <string.h>
#include <errno.h>struct S
{char arr[10];int age;float score;
};int main()
{struct S s = {"zhangsan", 25, 50.5f};FILE* pf = fopen("test.txt", "w");if(pf == NULL){perror("fopen");return 1;}fprintf(pf, "%s %d %f", s.arr, s.age, s.score);//关闭文件fclose(pf);pf = NULL;return 0;
}

 

5. fread和fwrite

这两个函数可以将数据以二进制的形式写入文件中,且相比于之前介绍的函数,他们只能对文件进行读取或写入。

5.1 fread

该函数可以从流(文件)中读取二进制的数据。

第一个参数ptr表示存放读取到的数据的空间的起始地址,第二个参数size表示每个数据的大小,第三个参数count表示读取数据的个数。

函数的返回值是成功读取到的数据的个数,如果返回值与count的值不相等,则说明在读取过程中发生了错误或遇到了文件末尾。 

如果size和count中,至少有一个为0,则返回值为0,且文件的状态和ptr指向空间的内容都保持不变。

使用示例:

#include <stdio.h>
#include <string.h>
#include <errno.h>struct S
{char arr[10];int age;float score;
};int main()
{struct S s = {0};FILE* pf = fopen("test.txt", "rb");if(pf == NULL){perror("fopen");return 1;}fread(&s, sizeof(struct S), 1, pf);printf("%s %d %f", s.arr, s.age, s.score);//关闭文件fclose(pf);pf = NULL;return 0;
}

5.2 fwrite

该函数可以将数据以二进制的形式写入流(文件)中。

第一个参数ptr表示存放要写入数据的空间的起始地址,第二个参数size表示每个数据的大小,第三个参数count表示写入数据的个数。

函数的返回值是是成功写入的数据的个数,如果返回值与count的值不相等,则说明在读取过程中发生了错误。 

如果size和count中,至少有一个为0,则返回值为0。

使用示例:

#include <stdio.h>
#include <string.h>
#include <errno.h>struct S
{char arr[10];int age;float score;
};int main()
{struct S s = {"zhangsan", 25, 50.5f};FILE* pf = fopen("test.txt", "wb");if(pf == NULL){perror("fopen");return 1;}fwrite(&s, sizeof(struct S), 1, pf);//关闭文件fclose(pf);pf = NULL;return 0;
}

5.3 二进制形式读写的优势

1. 文件具有不可读性,存储的信息较为保密。

2. 便于读写自定义类型的数据,如结构体,联合体等。

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

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

相关文章

【ReadPapers】A Survey of Large Language Models

LLM-Survey的llm能力和评估部分内容学习笔记——思维导图 思维导图 参考资料 A Survey of Large Language Models论文的github仓库

腾讯云优惠券领取方法大公开,省钱不再是难事

腾讯云—腾讯倾力打造的云计算品牌&#xff0c;以卓越科技能力助力各行各业数字化转型&#xff0c;为全球客户提供领先的云计算、大数据、人工智能服务&#xff0c;以及定制化行业解决方案和提供可靠上云服务&#xff0c;助力企业和开发者稳定上云&#xff01; 然而&#xff0…

粉丝免费福利第一期-海浪型手机支架

&#x1f341; 作者&#xff1a;知识浅谈&#xff0c;CSDN签约讲师&#xff0c;CSDN博客专家&#xff0c;华为云云享专家&#xff0c;阿里云专家博主 &#x1f4cc; 擅长领域&#xff1a;全栈工程师&#xff0c;大模型&#xff0c;爬虫、ACM算法 &#x1f492; 公众号&#xff…

Vue系列-el挂载

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>el:挂载点</title> </head> <body&g…

基于单片机微波炉加热箱系统设计

**单片机设计介绍&#xff0c;基于单片机微波炉加热箱系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的微波炉加热箱系统设计是一个融合了硬件与软件技术的综合性项目。以下是对该设计概要的详细描述&#xf…

P15:PATH环境变量

为什么要配置环境变量 当我们打开DOS窗口&#xff0c;输入&#xff1a;javac&#xff0c;出现下面问题。 原因&#xff1a;windows操作系统在当前目录中无法找到javac命令文件。Windows操作系统是如何搜索硬盘上某一个命令&#xff1f; 首先从当前目录中搜索该命令如果当前目录…

OSCP靶场--Snookums

OSCP靶场–Snookums 考点(RFI信息收集数据库发现凭据bas64解码su切换用户/etc/passwd覆盖提权) 1.nmap扫描 ##┌──(root㉿kali)-[~/Desktop] └─# nmap 192.168.216.58 -sV -sC -Pn --min-rate 2500 -p- Starting Nmap 7.92 ( https://nmap.org ) at 2024-03-30 03:39 E…

期货开户要找到适合自己的系统

物有一个生物圈&#xff0c;大鱼吃小鱼&#xff0c;小鱼吃虾。在期货市场这条生物圈里面&#xff0c;大部分人就是期货市场的虾子&#xff0c;是被吃的&#xff0c;所以必须成长起来&#xff0c;往更高一层走&#xff0c;到可以吃虾子的时候&#xff0c;就是挣钱的时候。学习不…

SpringBoot整合腾讯云邮件发送服务非STMP

SpringBoot整合腾讯云邮箱服务 1、pom配置 <!-- 腾讯云邮箱服务--><dependency><groupId>com.tencentcloudapi</groupId><artifactId>tencentcloud-sdk-java</artifactId><!-- go to https://search.maven.org/search?qtencen…

C++基础之虚函数(十七)

一.什么是多态 多态是在有继承关系的类中&#xff0c;调用同一个指令&#xff08;函数&#xff09;&#xff0c;不同对象会有不同行为。 二.什么是虚函数 概念&#xff1a;首先虚函数是存在于类的成员函数中&#xff0c;通过virtual关键字修饰的成员函数叫虚函数。 性质&am…

Acunetix v24.3 (Linux, Windows) - Web 应用程序安全测试

Acunetix v24.3 (Linux, Windows) - Web 应用程序安全测试 Acunetix | Web Application Security Scanner 请访问原文链接&#xff1a;https://sysin.org/blog/acunetix/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org 重要提…

PS从入门到精通视频各类教程整理全集,包含素材、作业等(3)复发

PS从入门到精通视频各类教程整理全集&#xff0c;包含素材、作业等 最新PS以及插件合集&#xff0c;可在我以往文章中找到 由于阿里云盘有分享次受限制和文件大小限制&#xff0c;今天先分享到这里&#xff0c;后续持续更新 中级教程 https://www.alipan.com/s/unii5YxtM8B 提…

V R虚拟现实元宇宙的前景|虚拟现实体验店加 盟合作|V R设备在线购买

VR&#xff08;虚拟现实&#xff09;技术作为一种新兴的技术&#xff0c;正在逐渐改变人们的生活和工作方式。随着技术的不断进步&#xff0c;人们对于元宇宙的概念也越来越感兴趣。元宇宙是一个虚拟世界&#xff0c;通过VR技术可以实现人们在其中进行各种活动和交互。 元宇宙的…

【JAVA】精密逻辑控制过程(分支和循环语句)

✅作者简介&#xff1a;大家好&#xff0c;我是橘橙黄又青&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a; 橘橙黄又青-CSDN博客 目标&#xff1a; 1. Java 中程序的逻辑控制语句 2. Java 中的输入输出方式 3. 完成…

22 多态

目录 多态的概念多态的定义及实现抽象类多态的原理单继承和多继承关系中的虚函数表继承和多态常见的面试问题 前言 需要声明的&#xff0c;下面的代码和解释的哦朴实vs2013x86环境&#xff0c;涉及指针是4bytes&#xff0c;如果要其他平台下&#xff0c;部分代码需要改动。比…

【尚硅谷周阳--JUC并发编程】【第十四章--ReentrantLock、ReentrantReadWriteLock、StampedLock讲解】

【尚硅谷周阳--JUC并发编程】【第十四章--ReentrantLock、ReentrantReadWriteLock、StampedLock讲解】 一、面试题二、简单聊聊ReentrantReadWriteLock1、是什么?1.1、读写锁说明1.2、演变1.3、读写锁意义和特点 2、特点2.1、优点2.2、code演示2.3、结论2.4、从写锁->读锁&…

安装 kubesphere 插件报错Error: UPGRADE FAILED: \“ks-minio\“ has no deployed releases

安装 kubesphere 插件报错Error: UPGRADE FAILED: “ks-minio” has no deployed releases TASK [common : Kubesphere | Creating manifests] ******************************** ok: [localhost] > (item{uname: ucustom-values-minio, ufile: ucustom-values-minio.yaml}…

什么是nginx正向代理和反向代理?

什么是代理&#xff1f; 代理(Proxy), 简单理解就是自己做不了的事情或实现不了的功能&#xff0c;委托别人去做。 什么是正向代理&#xff1f; 在nginx中&#xff0c;正向代理指委托者是客户端&#xff0c;即被代理的对象是客户端 在这幅图中&#xff0c;由于左边内网中…

第十四届蓝桥杯(八题C++ 题目+代码+注解)

目录 题目一&#xff08;日期统计 纯暴力&#xff09;&#xff1a; 代码&#xff1a; 题目二&#xff08;01串的熵 模拟&#xff09;&#xff1a; 代码&#xff1a; 题目三&#xff08;治炼金属&#xff09;&#xff1a; 代码&#xff1a; 题目四&#xff08;飞机降落 深度…

32-2 APP渗透 - 移动APP架构

前言 app渗透和web渗透最大的区别就是抓包不一样 一、客户端: 反编译: 静态分析的基础手段,将可执行文件转换回高级编程语言源代码的过程。可用于了解应用的内部实现细节,进行漏洞挖掘和算法分析等。调试: 排查软件错误的一种手段,用于分析应用内部原理和行为。篡改/重打…