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  line
	while(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的输入、输出、读写、流的刷新定位等相关概念及函数介绍,并根据这些函数进行了一个包含文件打开关闭、读写、格式化输出等内容的实现。

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

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

相关文章

iMazing2024功能强大的iPhone和iPad管理工具

iMazing是一款功能强大的iPhone和iPad管理工具&#xff0c;确实可以作为iTunes的替代品进行数据备份。以下是一些关于iMazing的主要特点和功能&#xff1a; 设备备份&#xff1a;iMazing可以备份iOS设备上的所有数据&#xff0c;包括照片、视频、音乐、应用程序等。与iTunes相比…

STM32存储左右互搏 SPI总线FATS文件读写SD/MicroSD/TF卡

STM32存储左右互搏 SPI总线FATS文件读写SD/MicroSD/TF卡 SD/MicroSD/TF卡是基于FLASH的一种常见非易失存储单元&#xff0c;由接口协议电路和FLASH构成。市面上由不同尺寸和不同容量的卡&#xff0c;手机领域用的TF卡实际就是MicroSD卡&#xff0c;尺寸比SD卡小&#xff0c;而…

SQLite数据库文件损坏的可能几种情况(一)

返回&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLiteC/C接口详细介绍sqlite3_stmt类&#xff08;十三&#xff09; 下一篇&#xff1a;SQLite使用的临时文件&#xff08;二&#xff09; 概述 SQLite数据库具有很强的抗损坏能力。如果应用程序崩溃&#xff0c…

Excel·VBA数组平均分组问题

看到一个帖子《excel吧-数据分组问题》&#xff0c;对一组数据分成4组&#xff0c;使每组的和值相近 上一篇文章《ExcelVBA数组分组问题》&#xff0c;解决了这个帖子问题的第1步&#xff0c;即获取所有数组分组形式的问题 接下来要获取分组和值最相近的一组&#xff0c;只需计…

Docker 搭建Redis集群

目录 1. 3主3从架构说明 2. 3主3从Redis集群配置 2.1关闭防火墙启动docker后台服务 2.2 新建6个docker容器实例 2.3 进去任意一台redis容器&#xff0c;为6台机器构建集群关系 2.4 进去6381&#xff0c;查看集群状态 3. 主从容错切换迁移 3.1 数据读写存储 3.1.1 查看…

【代驾+顺风车+货运】全开源双端APP代驾+顺风车+货运代驾小程序源码

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 一、详细介绍 系统是基于Thinkphpuniapp开发的&#xff0c;全开源未加密&#xff0c;这套源码可以拿回去自己做二开 后台用户端司机端 功能详情介绍&#xff1a; 车主实名认证&#xff0c;驾驶证认证&#xff0c;车…

【Spring】IoCDI详解

1. IoC详解 前面提到过IoC就是将对象的控制权交由Spring的IoC容器进行管理&#xff0c;由Spring的IoC容器创建和销毁bean&#xff0c;那么既然涉及到容器&#xff0c;就一定包含以下两方面功能&#xff1a; bean的存储bean的获取 1.1 类注解 Spring框架为了更好地服务应用程…

GIT开发中的使用

GIT 什么是Git&#xff1f; Git是一个版本控制器&#xff1a;可以记录工程的每一次改动和版本迭代的一个管理系统 注意事项&#xff1a; 所有的版本控制系统&#xff0c;其实只能跟踪文本文件的改动&#xff08;如TXT文件、网页、所有的程序代码等&#xff09;&#xff0c;…

数据库系统概论(超详解!!!) 第四节 关系数据库标准语言SQL(Ⅱ)

1.数据查询 SELECT [ ALL | DISTINCT] <目标列表达式>[&#xff0c;<目标列表达式>] … FROM <表名或视图名>[&#xff0c; <表名或视图名> ] … [ WHERE <条件表达式> ] [ GROUP BY <列名1> [ HAVING <条件表达式> ] ] [ ORDER BY…

Mac 装 虚拟机 vmware、centos7等

vmware&#xff1a; https://www.vmware.com/products/fusion.html centos7 清华镜像&#xff1a; 暂时没有官方的 m1 arm架构镜像 centos7 链接: https://pan.baidu.com/s/1oZw1cLyl6Uo3lAD2_FqfEw?pwdzjt4 提取码: zjt4 复制这段内容后打开百度网盘手机App&#xff0c;操…

2015年认证杯SPSSPRO杯数学建模C题(第二阶段)荒漠区动植物关系的研究全过程文档及程序

2015年认证杯SPSSPRO杯数学建模 C题 荒漠区动植物关系的研究 原题再现&#xff1a; 环境与发展是当今世界所普遍关注的重大问题, 随着全球与区域经济的迅猛发展, 人类也正以前所未有的规模和强度影响着环境、改变着环境, 使全球的生命支持系统受到了严重创伤, 出现了全球变暖…

生物信息学 GO、KEGG

文章目录 北大基因本体论分子通路KEGGGO注释分子通路鉴定 关于同源 相似性 b站链接&#xff1a;北大课程 概述了当前生物信息学领域中几个重要的概念和工具&#xff0c;介绍基因本体论&#xff08;Gene Ontology, GO&#xff09;、分子通路知识库KEGG&#xff08;Kyoto Encyclo…

Redis进阶

缓存雪崩 缓存穿透 缓存击穿 Redis在项目中常用作缓存来使用&#xff0c;主要用两大作用&#xff1a; 1.提升系统的性能 Redis基于内存&#xff0c;IO效率远高于MySql数据库 2.减少数据库压力 Redis处理很多请求&#xff0c;使用Redis作为缓存可以减少数据库的请求量&…

9.2024

使用冒泡排序给{10 ,1,35,61,89,36,55}排序 代码&#xff1a; public class 第九题 {public static void main(String[] args) {int a[]{10,1,35,61,89,36,55};for (int i0;i<a.length-1;i){for (int j0;j<a.length-1;j){if (a[j]>a[j1]){int temp0;tempa[j];a[j]a[…

数字量化值Digital Number, 辐射亮度Radiance, 反射率Reflectance,发射率Emissive

我们经常听到有人困惑于图像的像素值储存的是什么信息&#xff0c;以及如何获取所需的值。这里我们总结以下几个概念。 数字量化值&#xff08;Digital Number &#xff1a;DN&#xff09; 像素值的通用术语是数字量化值或DN值&#xff0c;它通常被用来描述还没有校准到具有意…

hbase启动错误-local host is“master:XXXX“ destination is:master

博主的安装前提&#xff1a; zookeeper安装完成&#xff0c;且启动成功 hdfs高可用安装&#xff0c;yarn高可用安装&#xff0c;且启动成功 报错原因&#xff1a;端口配置不对 解决方案&#xff1a; 输入&#xff1a;hdfs getconf -confKey fs.default.name 然后把相应的…

Spring Cloud 网关Gateway + 配置中心

网关 网络的接口&#xff0c;负责请求的路由、转发、身份校验 路由&#xff1a;告诉请求去哪找 转发&#xff1a;请求找不到直接带请求过去 路由及转发 判断前端请求的规则就这么配 当前情况下只需要访问8080端口 就可以完成对全部微服务的访问 路由属性 登录校验 没必要在每…

如果有意外,这个窗口就会弹出,希望你们能够看到!——夜读(逆天打工人爬取热门微信文章解读)

第一个日二更 引言Python 代码第一篇 定时任务运行结果 第二篇 人民日报 【夜读】最好的教养&#xff0c;是对家人和颜悦色结尾 时间不会无缘无故增加 也不会无缘无故减少 我们唯一能够控制就是 加大时间的密度 引言 为了不让我在大庭广众下大喊我是沙比 我来更新文章啦 这次带…

网络七层模型之物理层:理解网络通信的架构(一)

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

【漏洞复现】商混ERP系统 DictionaryEdit.aspx接口处存在SQL注入漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…