C语言【文件操作】详解中

引言

        介绍和文件操作中文件的顺序读相关的函数

        看这篇博文前,希望您先仔细看一下这篇博文,理解一下文件指针和流的概念:C语言【文件操作】详解上-CSDN博客文章浏览阅读606次,点赞26次,收藏4次。先整体认识一下文件是什么,会打开和关闭文件。 关于对文件操作函数在下部分来介绍 https://blog.csdn.net/2401_88433210/article/details/146432061?spm=1011.2415.3001.10575&sharefrom=mp_manage_link

一、文件的顺序读写函数介绍

顺序读写函数(都需要头文件stdlib.h):

函数名功能(以文件为对象来说)适用于
fgetc字符输入函数所有输入流(文件流和stdin)
fputc字符输出函数所有输出流(文件流和stdout)
fgets文本行输入函数所有输入流(文件流和stdin)
fputs文本行输出函数所有输出流(文件流和stdout)
fscanf格式化输入函数所有输入流(文件流和stdin)
fprintf格式化输出函数所有输出流(文件流和stdout)
fread二进制输入函数文本输入流
fwrite二进制输出函数文本输出流

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

所有输出流⼀般指适用于标准输出流和其他输出流(如文件输出流)。

下面看代码理解

共四对函数,下面一个一个介绍

1.fputc和fgetc 

fputc 

      fputc函数原型:fputc - C++ Reference (cplusplus.com)

int fputc ( int character, FILE * stream );

写字符到文件中

成功写入到文件中,返回对应的ASCII值

如果写入失败,返回EOF

代码一(fputc):

        以只写的形式'w'打开文件data.c,没有该文件的话会自动创建一个该文件,并用fputc函数写入字符a到z。

//写字符到文件中
#include<stdio.h>
#include<stdlib.h>
int main()
{FILE* pf = fopen("data.txt", "w");//打开文件if (pf == NULL){perror("fopen");return 1;}//写字符//fputc('a', pf);//fputc('b', pf);//fputc('c', pf);//fputc('d', pf);//fputc('e', pf);for (int i = 'a'; i <= 'z'; i++){fputc(i, pf);}//关闭文件fclose(pf);pf = NULL;return 0;
}

运行结果:成功写入

fgetc 

        fgetc函数原型:fgetc - C++ Reference (cplusplus.com)

int fgetc ( FILE * stream );

(从文件中)读取字符成功,返回字符对应的ASCII值

如果读取失败或者遇到文件末尾,返回EOF

如果读取失败,会设置一个错误状态值------用ferror来判断(下一节讲)

如果遇到文件末尾,会设置一个遇到文件末尾的状态值------用feof来判断(下一节讲)

代码二(fgetc):

          以只读的形式'r'打开文件data.c,用fgetc函数读取字符a到z。

#include<stdio.h>
#include<stdlib.h>
int main()
{FILE* pf = fopen("data.txt", "r");//打开文件if (pf == NULL){perror("fopen");return 1;}int ch = fgetc(pf);printf("%c\n", ch);//ach = fgetc(pf);printf("%c\n", ch);//bch = fgetc(pf);printf("%c\n", ch);//c//会一个一个读出来ch = 0;while ((ch = fgetc(pf)) != EOF){printf("%c ", ch);}//关闭文件fclose(pf);pf = NULL;return 0;
}

运行结果:

 2.fputs和fgets函数

        fputs函数原型:fputs - C++ Reference (cplusplus.com)

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

将字符串,写入到文件中(\0不会写入到文件中)
成功后,将返回非负值。
出错时,该函数返回 EOF 并设置错误指示符 (ferror)。   

fputs 

代码一(fputs):

         以只写的形式'w'打开文件data.c,没有该文件的话会自动创建一个该文件,并用fputs函数写入字符串“hello word”。

#include<stdio.h>
#include<stdlib.h>
int main()
{FILE* pf = fopen("data.txt", "w");//打开文件if (pf == NULL){perror("fopen");return 1;}fputs("hello word\n", pf);//关闭文件fclose(pf);pf = NULL;return 0;
}

运行结果:

fgets 

   fgets函数原型:fgets - C++ Reference (cplusplus.com)

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

(从文件中)读取(num - 1)个字符到str中。(会读取换行符\n,最后一个位置是\0)

读取成功返回字符串str的地址

如果在读取任何字符之前发生这种情况,则返回的指针为空指针(并且 str 的内容保持不变)。
如果在尝试读取字符时遇到文件结尾,则设置 eof 指示符 (feof)。
如果发生读取错误,则设置错误指示符 (ferror) 并返回 null 指针(但 str 指向的内容可能已更改)。

代码二(fgets):       

        以只读的形式'r'打开文件data.c,用fgets函数读取字符串到数组中。

#include<stdio.h>
#include<stdlib.h>
int main()
{FILE* pf = fopen("data.txt", "r");//打开文件if (pf == NULL){perror("fopen");return 1;}char arr[20] = { 0 };fgets(arr, 20, pf);printf("%s", arr);//关闭文件fclose(pf);pf = NULL;return 0;
}

  运行结果:

调试看arr数组里面的内容: 

3. fscanf和fprintf函数

fprintf

        fprintf函数原型:fprintf - C++ Reference (cplusplus.com)

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

        可以类比printf函数来使用,只不过多了一个写入的流对象的指针

成功后,将返回写入的字符总数。
如果发生写入错误,则设置错误指示符 (ferror) 并返回负数。
如果在写入宽字符时出现多字节字符编码错误,则 errno 设置为 EILSEQ 并返回负数。

代码一(fprintf): 

        以只写的形式'w'打开文件data.c,没有该文件的话会自动创建一个该文件,并用fprintf函数写入数据,任何类型的数据都可以

#include<stdio.h>
#include<stdlib.h>
int main()
{FILE* pf = fopen("data.txt", "w");//打开文件if (pf == NULL){perror("fopen");return 1;}char arr[20] = "hello";int num = 100;double PI = 3.14;fprintf(pf, "%s %d %f", arr, num, PI);//关闭文件fclose(pf);pf = NULL;return 0;
}

运行结果:

fscanf

fscanf函数原型:fscanf - C++ 参考 (cplusplus.com)

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

        类比scanf来使用,只不过多了一个流对象的指针

        成功后,该函数返回成功填充的参数列表的项目数。

        如果在读取时发生读取错误或到达文件末尾,则会设置正确的指示符(feof 或 ferror)。而且,如果在成功读取任何数据之前发生任何情况,则返回 EOF。

代码二(fscanf): 

        以只读的形式'r'打开文件data.c,用fscanf函数读取内容到结构体中。

struct S
{char arr[20];int num;double PI;
};
#include<stdio.h>
#include<stdlib.h>
int main()
{FILE* pf = fopen("data.txt", "r");//打开文件if (pf == NULL){perror("fopen");return 1;}struct S s = { 0 };//读文件fscanf(pf, "%s %d %lf", s.arr, &(s.num), &(s.PI));printf("%s %d %lf\n", s.arr, s.num, s.PI);//关闭文件fclose(pf);pf = NULL;return 0;
}

运行结果:

4.fwrite和fread 

fwrite

fwrite函数原型:fread - C++ Reference (cplusplus.com)

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

ptr   :指向要写入的元素数组的指针,转换为 const void*。

size :要写入的每个元素的大小(以字节为单位)。
count : 元素数,每个元素的大小为 size 字节。

stream:指向指定输出流的 FILE 对象的指针。

结合代码来看一下就明白了:

代码一(fwrite): 

          以只写的形式'w'打开文件data.c,没有该文件的话会自动创建一个该文件,并用fwrite函数,写入二进制数据。

#include<stdio.h>
#include<stdlib.h>
int main()
{FILE* pf = fopen("data.txt", "w");//打开文件if (pf == NULL){perror(pf);return 1;}int arr[20] = { 1,2,3,4,5 };fwrite(arr, sizeof(arr[0]), 5, pf);fclose(pf);pf = NULL;return 0;
}

运行结果:

以二进制的形式来看: 

第一步:

第二步: 

第三步: (看)

fread 

fread函数原型:fread - C++ Reference (cplusplus.com)

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

ptr   :指向要写入的元素数组的指针,转换为 const void*。

size :要写入的每个元素的大小(以字节为单位)。
count : 元素数,每个元素的大小为 size 字节。

stream:指向指定输入流的 FILE 对象的指针。

结合代码来看一下就明白了:

代码二(fread):

    以只读的形式'r'打开文件data.c,用fread函数读取数据。

#include<stdio.h>
#include<stdlib.h>
int main()
{FILE* pf = fopen("data.txt", "r");//打开文件if (pf == NULL){perror(pf);return 1;}int arr[20] = { 0 };fread(arr, sizeof(arr[0]), 5, pf);for (int i = 0; i < 5; i++){printf("%d ", arr[i]);}fclose(pf);pf = NULL;return 0;
}

运行结果:

 二、理解函数适用的流

         对应适用于所以流的函数,其参数部分的流部分可以是文件指针FILE的指针也可以是屏幕和键盘的输入输出流即stdin 和 stdout 流。

以fprintf函数来举个例子,其他类似:

#include<stdio.h>
#include<stdlib.h>
struct S
{char arr[20];int num;double pai;
};
int main()
{struct S s = { "world", 202, 3.14 };fprintf(stdout, "%s %d %.2lf", s.arr, s.num, s.pai);return 0;
}

运行结果:

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

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

相关文章

损失函数理解(二)——交叉熵损失

损失函数的目的是为了定量描述不同模型&#xff08;例如神经网络模型和人脑模型&#xff09;的差异。 交叉熵&#xff0c;顾名思义&#xff0c;与熵有关&#xff0c;先把模型换成熵这么一个数值&#xff0c;然后用这个数值比较不同模型之间的差异。 为什么要做这一步转换&…

学习笔记--基于Sa-Token 实现Java项目单点登录+同端互斥检测

目录 同端互斥登录 单点登录SSO 架构选型 模式二: URL重定向传播 前后端分离 整体流程 准备工作 搭建客户端 搭建认证中心SSO Server 环境配置 开放认证接口 启动类 跨域处理 同端互斥登录 同端互斥登陆 模块 同端互斥登录指&#xff1a;同一类型设备上只允许单地…

蓝桥杯 小球反弹

问题描述 有一个长方形&#xff0c;长为 343720 单位长度&#xff0c;宽为 233333 单位长度。 在其内部左上角顶点有一小球&#xff08;无视其体积&#xff09;&#xff0c;其初速度方向如图所示&#xff0c;且保持运动速率不变。分解到长宽两个方向上的速率之比为&#xff1…

PyCharm中使用pip安装PyTorch(从0开始仅需两步)

无需 anaconda&#xff0c;只使用 pip 也可以在 PyCharm 集成环境中配置深度学习 PyTorch。 本文全部信息及示范来自 PyTorch 官网。 以防你是super小白&#xff1a; PyCharm 中的命令是在 Python Console 中运行&#xff0c;界面左下角竖排图标第一个。 1. 安装前置包 numpy …

在刀刃上发力:如何精准把握计划关键节点

关键路径分析是项目管理中的一种重要方法&#xff0c;它通过在甘特图中识别出项目中最长、最关键的路径&#xff0c;来确定项目的最短完成时间。 关键路径上的任务都是项目成功的关键因素&#xff0c;任何延误都可能导致整个项目的延期。关键路径分析对于项目管理者来说至关重要…

Burp Suite 代理配置全流程指南

目录 一、基础环境准备 1.1 安装与启动 1.2 环境变量配置 二、核心代理配置 2.1 Burp 代理监听设置 2.2 浏览器代理配置 Firefox Chrome/Edge 代理插件推荐 三、HTTPS 流量拦截 3.1 证书安装流程 3.2 移动端配置 四、高级功能应用 4.1 流量操作 4.2 HTTP 历史记…

【数据分享】我国乡镇(街道)行政区划数据(免费获取/Shp格式)

行政区划边界矢量数据是我们在各项研究中最常用的数据。之前我们分享过2024年我国省市县行政区划矢量数据&#xff08;可查看之前的文章获悉详情&#xff09;&#xff0c;很多小伙伴拿到数据后咨询有没有精细到乡镇&#xff08;街道&#xff09;的行政区划矢量数据&#xff01;…

考研复习之队列

循环队列 队列为满的条件 队列为满的条件需要特殊处理&#xff0c;因为当队列满时&#xff0c;队尾指针的下一个位置应该是队头指针。但是&#xff0c;我们不能直接比较 rear 1 和 front 是否相等&#xff0c;因为 rear 1 可能会超出数组索引的范围。因此&#xff0c;我们需…

如果我没安装office,只安装了wps,python 如何通过win32com.client.Dispatch操作ppt?

文章目录 win32com.client.Dispatch是干嘛的?什么是Windows COM组件COM和dll有关系吗?python 如何通过win32com.client.Dispatch操作ppt?如果我没安装office,只安装了wps,python 如何通过win32com.client.Dispatch操作ppt?附录:完整报错信息win32com.client.Dispatch是干…

介绍一个测试boostrap表格插件的好网站!

最近在开发一个物业管理系统。用到bootstrap的表格插件bootstrap table&#xff0c;官方地址&#xff1a; https://bootstrap-table.com/ 因为是英文界面&#xff0c;对国人不是很友好。后来发现了小书童网站 IT小书童 - 为程序员提供优质教程和文档 网站&#xff1a; IT小…

七、服务器远程桌面报错

&#x1f33b;&#x1f33b;目录&#x1f33b;&#x1f33b; 一、远程桌面报错-用户账户限制&#xff08;例如&#xff0c;时间限制&#xff09;会阻止你登录。 一、远程桌面报错-用户账户限制&#xff08;例如&#xff0c;时间限制&#xff09;会阻止你登录。 原因是被远程的系…

不做颠覆者,甘为连接器,在技术叠层中培育智能新物种

--- 一、技术融合的必然&#xff1a;从“非此即彼”到“兼容共生” 当大模型的热浪撞上传统IT的礁石&#xff0c;企业智能化的真相浮出水面&#xff1a; 新旧技术的“量子纠缠”&#xff1a;MySQL与向量数据库共享数据总线&#xff0c;规则引擎与大模型共处决策链路 需求进…

# [RPA] 使用八爪鱼进行高效网页数据采集

在许多行业中&#xff0c;数据是核心资产。然而&#xff0c;虽然许多网站的文本内容可以免费访问&#xff0c;但手动一条一条采集&#xff0c;不仅耗时耗力&#xff0c;还容易出错。这种情况下&#xff0c;使用自动化工具来提高采集效率就显得尤为重要。本文将介绍 八爪鱼 这一…

Blazor+PWA技术打造全平台音乐播放器-从音频缓存到离线播放的实践之路

基于PWA技术打造全平台音乐播放器&#xff1a;从音频缓存到离线播放的实践之路 这篇文章是自己的想法结合AI之后润色的。在数字音乐领域&#xff0c;用户期望随时随地享受音乐&#xff0c;无论是手机还是电脑&#xff0c;无论是在线还是离线。**渐进式Web应用&#xff08;PWA&…

众乐影音-安卓NAS-Player的安装和设置说明

众乐影音是耘想公司基于原有的安卓NAS&#xff0c;增加影音和图片播放功能后&#xff0c;推出的一款新概念NAS-Player。它不仅可以接收手机端推送的视频&#xff0c;音频和图片文件进行播放&#xff0c;还可以把任何一台安卓设备&#xff0c;比如手机、机顶盒、各种安卓盒子等&…

Linux shell脚本-概述、语法定义、自定义变量、环境变量、预设变量、变量的特殊用法(转义字符、单双引号、大小括号)的验证

目录 1.shell概述 1.1作为应用程序&#xff1a; 1.2 shell 作为一门语言 2.shell 语法 2.1 shell脚本的定义与执行 &#xff08;1&#xff09;新建文件 &#xff08;2&#xff09;程序开头第一行 必须写shell的类型 &#xff08;3&#xff09;程序编写完后&#xff0c…

redis集群的原理是什么?

大家好&#xff0c;我是锋哥。今天分享关于【redis集群的原理是什么?】面试题。希望对大家有帮助&#xff1b; redis集群的原理是什么? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Redis 集群&#xff08;Redis Cluster&#xff09;是一种分布式解决方案&…

PicFlow:一个图片处理与上传工作流工具(图床上传工具)

自从学习搭建网站以来&#xff0c;我就把很多图片托管在七牛云等图床平台上。以前总是通过网页批量上传&#xff0c;需要登录并一步步跳转网页操作&#xff0c;久而久之就厌烦了&#xff0c;于是花了一天时间用 Python 写了一个工具 —— PicFlow&#xff0c;从名字可以看出&am…

常⻅CMS漏洞之一:WordPress

WordPress是⼀个以PHP和MySQL为平台的⾃由开源的博客软件和内容管理系统。WordPress具有插件架构和模板系统。截⾄2018年4⽉&#xff0c;排名前1000万的⽹站中超过30.6%使⽤WordPress。 WordPress是最受欢迎的⽹站 内容管理系统。全球有⼤约30%的⽹站(7亿5000个)都是使⽤WordP…

一文说清预训练与微调:AI的双重训练法则

什么是预训练&#xff1f; 预训练是大型语言模型训练的第一步。它在资金和计算能力的支持下&#xff0c;通过深入分析大量的文本数据&#xff0c;使模型建立起语言的基本构架。在这一阶段&#xff0c;模型通过学习海量的书籍、文章和网页&#xff0c;识别出语言的语法、句法和…