Linux文件IO(2):使用标准IO进行文件的打开、关闭、读写、流定位等相关操作

目录

前言

文件的打开和关闭的概念

文件的打开

文件的打开函数

文件打开的模式

文件的关闭

文件的关闭函数

注意事项

字符的输入(读单个字符)

字符输入的函数

注意事项

字符的输出(写单个字符)

字符输出的函数

注意事项

行输入(读取整个行)

行输入的函数

注意事项

行输出(写整行)

行输出的函数

二进制读写

文本文件和二进制的区别

二进制读写函数

注意事项

流的刷新

流的刷新函数

流的定位

流的定位函数

注意事项

判断流是否出错和结束

判断流是否出错和结束函数

格式化输出

格式化输出函数

格式化输入

格式化输入函数

代码练习

要求

具体实现代码

测试结果

总结


前言

上文对标准IO、流及缓冲区的概念进行介绍并进行了相关实验,上文链接点这里,本文来介绍使用标准IO进行文件的打开、关闭、读、写等相关操作。

文件的打开和关闭的概念

打开就是占用资源

关闭就是释放资源

文件的打开

文件的打开函数

FILE *fopen (const char *path, const char *mode);

path:普通文件当前路径不需要加目录,其他要使用完成的路径

mode:文件打开的模式

返回值:出错返回NULL,所以使用fopen函数必须判断是否为空

文件打开的模式

"r"或"rb"以只读方式打开文件,文件必须存在。
"r+"或"r+b"以读写方式打开文件,文件必须存在
"w"或"wb"以只写方式打开文件,若文件存在则文件长度清为0。若文件不存在则创建。
"w+"或"w+b"以读写方式打开文件,其他同"w"。
"a"或"ab"以只写方式打开文件,若文件不存在则创建;向文件写入的数据被追加到文件末尾。
"a+"或"a+b"以读写方式打开文件。其他同"a"。

文件的关闭

文件的关闭函数

int fclose(FILE *stream)

fclose()调用成功返回0,失败返回EOF(-1),并设置errno。

流关闭时自动刷新缓冲中的数据并释放缓冲区,比如:常规文件把缓冲区内容写入磁盘。

当一个程序正常终止时,所有打开的流都会被关闭。

注意事项

fclose()函数的入参stream必须保证为非空,否则出现断错误。

字符的输入(读单个字符)

字符输入的函数

int  fgetc(FILE *stream);
int  getc(FILE *stream);   //宏
int  getchar(void);

成功时返回读取的字符,若到文件末尾或出错时返回EOF(-1)。

getchar()等同于fgetc(stdin)

getc和fgetc区别就是一个时宏一个是函数

注意事项

1、函数返回值是int类型不是char类型,主要是为了扩展返回值的范围。

2、stdin也是FILE*的指针,是系统定义好的,指向的是标准输入(键盘输入)。

3、打开文件后读取,是从文件开头开始读,读完一个后读写指针会后移。

4、调用getchar会阻塞,等待你的键盘输入

字符的输出(写单个字符)

字符输出的函数

int  fputc(int c, FILE *stream);
int  putc(int c, FILE *stream);
int  putchar(int c);

成功时返回写入的字符;出错时返回EOF。

putchar(c)等同于fputc(c, stdout)。

注意事项

1、返回和输入参数都是int类型

2、遇到这种错误:Bad file descriptor,  很可能是文件打开的模式错误(只读模式去写,只写模式去读)

行输入(读取整个行)

行输入的函数

char  *gets(char *s);  读取标准输入到缓冲区s
char *fgets(char *s, int size, FILE *stream);

成功时返回s,到文件末尾或出错时返回NULL

遇到’\n’或已输入size-1个字符时返回,总是包含’\0’

注意事项

1、gets函数已经被淘汰,因为会导致缓冲区溢出

2、fgets 函数第二个参数,输入的数据超出size,size-1个字符会保存到缓冲区,最后添加’\0’,如果输入数据少于size-1 后面会添加换行符。

行输出(写整行)

行输出的函数

int  puts(const char *s);
int fputs(const char *s,  FILE *stream);

成功时返回非负整数;出错时返回EOF

puts将缓冲区s中的字符串输出到stdout,并追加’\n’

fputs将缓冲区s中的字符串输出到stream,不追加  ‘\n’

二进制读写

文本文件和二进制的区别

存储的格式不同:文本文件只能存储文本。

计算机内码概念:文本符号在计算机内部的编码(计算机内部只能存储数字0101001....,所以所有符号都要编码)

二进制读写函数

size_t fread(void *ptr, size_t size, size_t n, FILE *fp);
//void *ptr  读取内容放的位置指针
//size_t size 读取的块大小
//size_t n 读取的个数
//FILE *fp  读取的文件指针size_t fwrite(const void *ptr, size_t size, size_t n, FILE *fp);
//void *ptr  写文件的内容的位置指针
//size_t size 写的块大小
//size_t n 写的个数
//FILE *fp  要写的文件指针

注意事项

文件写完后,文件指针指向文件末尾,如果这时候读,读不出来内容。

解决办法:移动指针(后面讲解)到文件头;关闭文件,重新打开

流的刷新

流的刷新函数

int fflush(FILE *fp);

成功时返回0;出错时返回EOF。

将流缓冲区中的数据写入实际的文件。

Linux下只能刷新输出缓冲区,输入缓冲区丢弃。

如果输出到屏幕使用fflush(stdout)。

流的定位

流的定位函数

long ftell(FILE *stream);
long fseek(FILE *stream, long offset,  int whence);
void rewind(FILE *stream);

ftell()成功时返回当前读写位置,出错时返回EOF。

fseek()定位一个流,成功时返回0,出错时返回EOF。

rewind()将流定位到文件开始位置

whence参数:SEEK_SET/SEEK_CUR/SEEK_END

offset参数:偏移量,可正可负

SEEK_SET从距文件开头 offset 位移量为新的读写位置
SEEK_CUR以目前的读写位置往后增加 offset 个位移量
SEEK_END将读写位置指向文件尾后再增加 offset 个位移量

注意事项

1、打开a模式,fseek无效

2、读写流时,当前读写位置自动后移。

判断流是否出错和结束

判断流是否出错和结束函数

#include  <stdio.h>
int ferror(FILE *stream);
int feof(FILE *stream);

ferror()返回1表示流出错;否则返回

feof()返回1表示文件已到末尾;否则返回0

格式化输出

格式化输出函数

int fprintf(FILE *stream, const char *fmt, …);
int sprintf(char *s, const char *fmt, …);

成功时返回输出的字符个数;出错时返回EOF。

格式化输入

格式化输入函数

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

代码练习

要求

1、每隔1s以指定格式 “年-月-日” 分别写入文件和缓冲区;

2、该程序无限循环,直到Ctrl+C中断程序;

具体实现代码

#include <stdio.h>
#include <time.h>
#include <unistd.h>
#include <string.h>
int main(int argc,const char* argv)
{FILE *fp;time_t ctime;struct tm *ctimester;int linecount = 0;char buf[32];fp = fopen("1.txt","a+");if(fp == NULL){perror("fopen");return 0;}//calculate 1.txt  linewhile(fgets(buf,32,fp)!=NULL){if(buf[strlen(buf)-1] == '\n'){linecount++;}}while(1){ctime = time(NULL);ctimester = localtime(&ctime);printf("%04d-%02d-%02d %02d:%02d:%02d\n",ctimester->tm_year+1900,ctimester->tm_mon+1,ctimester->tm_mday,ctimester->tm_hour,ctimester->tm_min,ctimester->tm_sec);fprintf(fp,"%d, %04d-%02d-%02d %02d:%02d:%02d\n",linecount++,ctimester->tm_year+1900,ctimester->tm_mon+1,ctimester->tm_mday,ctimester->tm_hour,ctimester->tm_min,ctimester->tm_sec);fflush(fp);sleep(1);}fclose(fp);return 0;
}

测试结果

总结

本文总结了C语言标准IO的输入、输出、读写、流的刷新定位等相关概念及函数介绍,并根据这些函数进行了一个包含文件打开关闭、读写、格式化输出等内容的实现。

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

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

相关文章

探索海外应用加速的作用与优势

随着互联网的快速发展&#xff0c;海外应用加速作为一种提高网络连接速度和性能的技术手段越来越受到关注。那么&#xff0c;海外应用加速究竟有什么作用呢&#xff1f;以下是这种加速技术的主要作用&#xff1a; 降低延迟&#xff1a; 海外应用加速在降低数据传输延迟方面发挥…

项目模块—实现抑郁测评(小程序)

script <script setup> import { ref } from "vue";//控制轮播图页码 let current ref(0);//答题逻辑 const add (value) > {if (current.value < 9) {current.value current.value 1;} else {uni.switchTab({url: "/pages/my/my",});} }…

双端队列deque和vector以及list的优缺点比较

参考:https://blog.csdn.net/TWRenHao/article/details/123483085 一、vector vector具体用法详情点这里 优点&#xff1a; 支持随机访问 CPU高速环缓存命中率很高 缺点&#xff1a; 空间不够&#xff0c;便需要增容。而增容代价很大&#xff0c;还存在一定的空间浪费。 头部…

redis在docker安装并启动流程

1、启动server docker run -d -p 6379:6379 --name redis01 redis:7.2.4以上命令&#xff0c;每次启动新的Redis容器&#xff0c;数据会丢失。 我们需要挂载数据文件&#xff0c;在宿主机上面&#xff0c;这样就可以持久化数据. 2、挂载数据文件&#xff08;可根据需求选择…

Git相关命令(一)

一、简介 Git 是一个开源的分布式版本控制系统。 当然&#xff0c; git 不会傻傻的把你的每一个版本完整的存储下来&#xff0c;他仅仅会存储每次修改的位置和内容&#xff08;可持久化&#xff09;&#xff0c;每一次 commit 可以理解为产生一个版本&#xff0c;接下来的版本…

vivado 生成比特流或器件镜像

在生成比特流或器件镜像之前 &#xff0c; 请复查其设置 &#xff0c; 确保这些设置对于您的设计都正确无误 &#xff0c; 这一点至关重要。 Vivado IDE 中的比特流和器件镜像设置分为 2 种类型 &#xff1a; 1. 比特流或器件镜像文件格式设置。 2. 器件配置设置。 在 V…

数据结构刷题篇 之 【力扣二叉树基础OJ】详细讲解(含每道题链接及递归图解)

有没有一起拼用银行卡的&#xff0c;取钱的时候我用&#xff0c;存钱的时候你用 1、相同的树 难度等级&#xff1a;⭐ 直达链接&#xff1a;相同的树 2、单值二叉树 难度等级&#xff1a;⭐ 直达链接&#xff1a;单值二叉树 3、对称二叉树 难度等级&#xff1a;⭐⭐ 直达…

【Godot4自学手册】第三十一节使用WorldEnvironment为地宫入口粒子系统添加辉光

本节&#xff0c;首先我将使用WorldEnvironment节点为地宫入口的例子系统添加辉光&#xff0c;让游戏看上去效果更加灿烂。其次加入相应提示信息&#xff0c;白天到达地宫附近、未杀死怪物进入地宫&#xff0c;都有提示信息&#xff0c;达到条件后地宫方可进入。先看一下效果&a…

CSS之动画

一&#xff0c;动画的制作 实现盒子绕圈走 二&#xff0c; 动画的常用属性 三&#xff0c;动画简写属性 前面两个属性一定要写&#xff0c;第三个linear是指匀速的意思&#xff08;默认是ease&#xff09;

Machine Learning机器学习之数据可视化

目录 前言 一、 数据预处理与清洗 二、常见可视化技术 三、可视化工具和平台 博主介绍&#xff1a;✌专注于前后端、机器学习、人工智能应用领域开发的优质创作者、秉着互联网精神开源贡献精神&#xff0c;答疑解惑、坚持优质作品共享。本人是掘金/腾讯云/阿里云等平台优质作者…

tls和ssl的区别,ssh和ssl区别

在网络通信和安全领域&#xff0c;TLS&#xff08;Transport Layer Security&#xff09;、SSL&#xff08;Secure Sockets Layer&#xff09;和SSH&#xff08;Secure Shell&#xff09;是常见的加密协议&#xff0c;它们都起着保护数据安全的重要作用。在本文中&#xff0c;我…

PPP、RRE、MGRE综合实验

一、实验拓扑图 二、实验要求 1.R5为ISP&#xff0c;只能进行IP地址配置&#xff0c;其所有地址均配为公有IP地址&#xff1b; 2.R1和R5间使用PPP的PAP认证&#xff0c;R5为主认证方: R2与R5之间使用ppp的CHAP认证&#xff0c; R5为主认证方;R3与R5之间使用HDLC封装; 3.R1、R2、…

MSTP环路避免实验(思科)

华为设备参考&#xff1a;MSTP环路避免实验&#xff08;华为&#xff09; 一&#xff0c;技术简介 MSTP&#xff08;多生成树协议&#xff09;&#xff0c;MSTP解决了STP和RSTP没有考虑vlan的问题&#xff0c;STP和RSTP将所有的vlan共享为一个生成树实例&#xff0c;无法实现…

linux提权笔记

1 linux提权简介 Linux提权&#xff0c;简单来说&#xff0c;就是用户尝试获取高于其当前权限级别的系统访问权限的过程。在Linux系统中&#xff0c;root用户拥有最高的权限&#xff0c;能够执行任何操作&#xff0c;包括修改系统文件、安装软件、管理用户账户等。而普通用户通…

岭师大数据技术原理与应用-序章-软工版

HeZaoCha-CSDN博客 序章—软工版 一、环境介绍1. VMware Workstation Pro2. CentOS3. Java4. Hadoop5. HBase6. MySQL7. Hive 二、系统安装1. 虚拟网络编辑器2. 操作系统安装 三、结尾 先说说哥们写这系列博客的原因&#xff0c;本来学完咱也没想着再管部署这部分问题的说&…

腾讯云优惠券领取步骤详解

腾讯云是腾讯公司旗下云计算品牌&#xff0c;作为国内领先的云计算服务提供商&#xff0c;为企业和个人提供了丰富的云产品和服务。为了吸引用户上云&#xff0c;腾讯云推出了各种优惠券&#xff0c;让用户在购买云产品时享受更多优惠。本文将为大家详细解析腾讯云优惠券的领取…

文献学习(自备)

收官大作&#xff0c;多组学融合的新套路发NC&#xff01;&#xff01; - 知乎 (zhihu.com) Hofbauer cell function in the term placenta associates with adult cardiovascular and depressive outcomes | Nature Communications 病理性胎盘炎症会增加几种成人疾病的风险&a…

系统分析师-参考模型

前言 网络术语中的参考模型指的是OSI参考模型&#xff0c;由ISO&#xff08;国际标准化组织&#xff09;制定的一套普遍适用的规范集合&#xff0c;以使得全球范围的计算机平台可进行开放式通信。 ISO创建了一个有助于开发和理解计算机的通信模型&#xff0c;即开放系统互联OS…

探索数据结构:链式队与循环队列的模拟、实现与应用

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;数据结构与算法 贝蒂的主页&#xff1a;Betty’s blog 1. 队列的定义 队列&#xff08;queue&#xff09;是一种只允许在一端进…

docker--部署 (超详版) (五)

环境准备&#xff1a;docker&#xff0c;mysql&#xff0c;redis&#xff0c;镜像&#xff0c;nginx 把虚拟机打开&#xff0c;连接xshell&#xff0c;参考博客&#xff1a; https://blog.csdn.net/m0_74229802/article/details/136965820?spm1001.2014.3001.5501 一&#x…