标准IO编程

标准IO介绍

标准IO概念

  标准IO(标准输入输出)是指在程序中使用的输入输出函数库,它提供了一套标准的文件操作函数,如打开文件、读写文件、关闭文件等。这些函数库包括了stdio.h、stdlib.h等头文件中的函数,如fopen、fclose、fread、fwrite等。标准IO还包括了对标准输入stdin、标准输出stdout、标准错误输出stderr的操作。
  标准 IO 库处理很多细节。例如缓存分配,以优化长度执行 IO 等

标准IO与文件IO的区别

  文件IO是指对文件进行输入输出操作,包括打开文件、读写文件、关闭文件等。文件IO可以使用标准IO库提供的函数,也可以使用操作系统提供的文件IO函数,如open、read、write、close等。
  标准IO是建立在文件IO的基础上的高级抽象,它提供了更加方便、易用的接口,使得程序员可以更简单地进行输入输出操作。而文件IO则是更底层的操作,直接调用操作系统提供的文件IO函数来进行文件操作。标准IO和文件IO在功能上是相似的,但是在实现方式和使用方法上有一定的差异。
  当然最大的区别就是标准IO有独特的缓存机制。

标准IO的缓存分类

1)全缓存:当填满标准IO缓存后才进行实际的IO操作。
2)行缓存:当输入或输出中遇到新行符时,标准IO库执行IO操作。
3)不带缓存:stderr就是了。

//全缓存
#include<stdio.h>
int main(int argc,char *argv[])
{
	//open file
	FILE * fp = fopen(argv[1],"w+");
	//write
	for(int i = 0; i < 1024; i++)
	{
		fwrite("hello",5,1,fp);
	}
	//此处的while(1)死循环的为了防止程序结束清空缓存区
	//将剩余的“hello”写入到文件中
	while(1);
	//close
	fclose(fp);
	return 0;
}

在这里插入图片描述
运行结果如上图,一共写入了4k字节,但是按照for循环中应该写入5k(5*1024)字节,故可看出全缓存大小为4k字节。

//行缓存
#include <stdio.h>
int main(int argc,char *argv[])
{
	//write
	for(int i = 0; i< 500;i++)
	{
		//当遇到换行符时,会把缓存区的全部内容输出
		printf("%03d\n",i);
	}
	while(1);
	return 0;
}

缓存的作用

  缓存是一块空间,用来暂时存储东西。缓存的作用是在计算机系统中临时存储数据,以便提高数据访问速度和系统性能。
  通过缓存,系统可以将频繁访问的数据或计算结果保存在内存或其他高速存储设备中,以便在需要时能够快速获取,而不必每次都重新计算或从低速存储设备中读取数据。这样可以减少数据访问的延迟,提高系统的响应速度,并减轻对底层存储设备的负载。缓存还可以有效地减少网络传输的数据量,从而节省带宽和降低网络延迟。因此,缓存在提高系统性能和用户体验方面起着重要的作用。

标准IO函数

fopen  打开文件

函数原型:FILE * fopen(const char * path,const char * mode);
参数介绍:
  path:想要打开的文件的 路径+文件名字
  mode:打开文件的方式
返回值:文件顺利打开后,指向该流的文件指针(文件流指针)就会被返回。若果文件打开失败则返回 NULL,并把错误代码存在 errno中。

打开方式解释
r只读,且文件必须存在
r+读写,且文件必须存在
w只写,但是会清空文件,文件不存在会创建文件
w+读写,但是会清空文件,文件不存在会创建文件
a追加写,文件不存在创建文件,数据会从文件尾开始写
a+读追加写,文件不存在创建文件,数据会从文件尾开始写
	FILE * fp = fopen ( "./1.txt" , "w+" );

fclose  关闭文件

函数原型:int fclose(FILE * stream);
参数介绍:
  stream:fopen函数返回的FILE *文件流指针
返回值:若关文件动作成功则返回 0,有错误发生时则返回 EOF 并把错误代码存到 errno;

	fclose( fp );

fflush  刷新缓存区

函数原型:int fflush(FILE* stream);
参数介绍:
  stream:fopen函数返回的FILE *文件流指针
返回值:若刷新动作成功则返回 0,有错误发生时则返回 EOF 并把错误代码存到 errno;

	fflush( fp );

fgetc  单个字符读

函数原型:int fgetc(FILE * stream);
参数介绍:
  stream:fopen函数返回的FILE *文件流指针
返回值:: fgetc()会返回读取到的字符,若返回 EOF 则表示到了文件尾

	char ch = fgetc(fp);

fputc  单个字符写

函数原型:int fputc(int c,FILE * stream);
参数介绍:
  stream:fopen函数返回的FILE *文件流指针
返回值:fputc()会返回写入成功的字符,即参数 c。若返回 EOF 则代表写入失败

	char ch = 'c';
	fputc(ch,fp);

fgets  字符串读

函数原型:char * fgets(char * s,int size,FILE * stream);
参数介绍:
  s:保存读取数据的容器地址
  size:一次性读多少个字节(不能超过容器大小)
  stream:fopen函数返回的FILE *文件流指针
返回值:fgets()若成功则返回 s 指针,返回 NULL 则表示有错误发生。

	// buff 和 readbuff 中的内容一致
	char readbuff[512] = {0};
	//这里的sizeof 可以减一 
	//防止刚好512个数据,导致'\0'无法存储
	char * buff = fgets( readbuff , sizeof( readbuff ) , fp );

fputs  字符串写

函数原型:int fputs(const char * s,FILE * stream);
参数介绍:
  s:保存写入数据的容器地址
  stream:fopen函数返回的FILE *文件流指针
返回值:若成功则返回 1,返回 EOF 则表示有错误发生。

	char writebuff[512] = { "HELLO WORLD" };
	fputs( writebuff , fp );

fread  块读

函数原型:size_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream);
参数介绍:
  ptr:保存读取数据的块容器地址
  size:要读取数据的单个数据的大小
  nmemb:要读取数据的个数
  stream:fopen函数返回的FILE *文件流指针
返回值:返回实际读取到的 nmemb 数目。

	struct student stu[STU_SIZE]size_t  n = fread( stu , sizeof(stu) , 1 , fp );

fwrite  块写

函数原型:size_t fwrite(const void * ptr,size_t size,size_t nmemb,FILE * stream);
参数介绍:
  ptr:保存写入数据的块容器地址
  size:要写入数据的单个数据的大小
  nmemb:要写入数据的个数
  stream:fopen函数返回的FILE *文件流指针
返回值:返回值返回实际写入的 nmemb 数目。

	struct student stu[STU_SIZE] = { {"M3","11"},{"DAM","666"}}size_t  n = fwrite( stu , sizeof(stu) , 2 , fp );

fseek  移动文件中的读写位置

函数原型:int fseek(FILE * stream,long offset,int whence);
参数介绍:
  stream:fopen函数返回的FILE *文件流指针
  offset:这是相对 whence 的偏移量(单位:字节)
  whence:发生偏移的位置
返回值:当调用成功时则返回 0,若有错误则返回-1,errno 会存放错误代码。

whence参数说明
SEEK_SET文件的开头
SEEK_CUR文件指针所在的当前位置
SEEK_END文件的末尾
	//向下偏移 一个字节
	fseek( fp , 1 , SEEK_SET );
	//向下偏移一个 stu 长度
	fseek( fp , sizeof(stu) , SEEK_CUR  );
	//向上偏移一个 stu长度
	fseek( fp , -sizeof(stu) , SEEK_CUR  );

getline  行读取

函数原型:ssize_t getline(char **lineptr, size_t *n, FILE *stream);
参数介绍:
  lineptr:指向存储读取文本的缓冲区的指针
  n:缓冲区的大小
  stream:fopen函数返回的FILE *文件流指针
返回值:函数返回值为读取的字符数,如果发生错误或者到达文件末尾则返回-1。

	char * lineptr = NULL;
	//n参数表示缓冲区的大小,你可以将其设置为任意大小。
	//当lineptr指向的缓冲区大小不足以存储读取的文本时,
	//getline函数会自动重新分配足够大的内存,并更新 n 参数为新的缓冲区大小。
	int n = 0;
	getline( &lineptr , n , fp );
	
  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值