文件操作之系统IO标准IO格式化IO

本文深入解析Linux系统IO与标准IO的原理及应用,包括它们的接口函数、操作方式及区别,如缓存机制、文件光标操作、读写接口、格式化IO等,并附有实践案例。
inux 系统IO接口的作用:   操作系统提供给用户访问硬件设备的接口函数。    
		(它可以访问linux系统中的所有文件  普通文件,目录文件,(字符,块)设备文件,链接文件,管道文件,套接字文件)
		

标准IO接口: C 语言库提供给用户访问 《普通文件》  的接口函数。


标准IO 与 系统IO的区别: 
1.标准IO 只可以访问 普通文件  
2.标准IO 带数据缓存.(缓存区:减少系统调用的过程,来提高操作文件的速度)
3.标准IO 提供了多样化的访问普通文件接口,提高用户处理普通文件的效率。


缓存区的类型:  
1.不缓存 :  标准出错设备  和  系统IO 操作都是 不带缓存的。 
2.行缓存 :  标准输出与标准输入设备   (遇到\n就会刷新缓存区)
3.全缓存 :   标准IO接口操作普通文件     

全缓存刷新方式: 
1.缓存区满了  
2.进程正常退出    (主函数中return 0)
3.手动刷新缓存区   fflush 


//系统IO 与 标准IO 的输入 输出设备: 

0   ->  stdin  

1   ->  stdout

2   ->  strerr




//标准IO 接口的使用: 
 
man 3 fopen


	#include <stdio.h>

    FILE *fopen(const char *path, const char *mode);
		  path:需要打开的文件路径名   
		  mode:需要打开的文件权限 
		  FILE:文件结构体指针  ,指向文件的信息。 


mode的选的选择:  
“r”  : 以只读的方式打开文件,文件光标在头文件  
“r+” :以读写的方式打开文件,文件光标在头文件 
“w”  : 以只写的方式打开文件,文件存在则清空 ,文件不存在则创建  
“w+” : 以只读写的方式打开文件,文件存在则清空 ,文件不存在则创建  
“a”  : 以只写追加的方式打开文件,文件不存在则创建,文件光标在末尾 
“a+” : 以只读写追加的方式打开文件,文件不存在则创建,读的话光标在开始,写的话光标在末尾 




//标准IO 的读写接口: 

   #include <stdio.h>

       size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
			  ptr:    读取后数据缓存区    
			  size:  数据块的大小 
			  nmemb: 多少块数据    (写入字节大小为  size* nmemb)
			  stream:文件流指针   (fopen 返回)
	 

       size_t fwrite(const void *ptr, size_t size, size_t nmemb,
                     FILE *stream);
			  ptr:	待写入数据缓存区    
			  size:数据块的大小 
			  nmemb:多少块数据         (写入字节大小为  size* nmemb)
			  stream:文件流指针   (fopen 返回)

		//为什么要  size   * nmemb 这样去计算数据大小 ??? 
		
		因我们可以写 多种数据类型的数据 进去 文件中  例如: int  ,short  ..  
		
		练习: 写入  int  buf[10]={10,20,30,40,50,60,70,80,90};  //把该整形数组写入到文件中
		
		

------------------------标准IO 文件光标的操作-----------------------
     #include <stdio.h>
			//偏移文件光标 
       int fseek(FILE *stream, long offset, int whence);
		   stream:需要操作的文件指针  
		   offset:偏移量 
		   whence:参考位置  
		   
		   SEEK_SET, 文件头
		   SEEK_END, 文件末尾
           SEEK_CUR. 文件光标的当前位置

	   
	   
			返回值: 0 偏移成功 
					 -1 偏移失败

		 //获取文件光标的偏移量 
       long ftell(FILE *stream);
			stream: 需要获取偏移量的文件
			返回值: 偏移量的大小 


       void rewind(FILE *stream);  把光标偏移到文件头  等价于  
										fseek(FILE *stream,0,SEEK_SET);

----标准IO 读取信息处理----

   #include <stdio.h>

       void clearerr(FILE *stream);  //清空错误信息  或 文件结束标志 

       int feof(FILE *stream);  //文件到达末尾返回 非0 的值 

       int ferror(FILE *stream); //读取错误  返回 非0 的值 

       int fileno(FILE *stream); //通过文件指针获取文件描述符 




------------------------数据流操作-------------------------
数据流:每次操作数据的时候只会操作一个字符的数据。 


       #include <stdio.h>

       int fgetc(FILE *stream); //从stream 指针中获取一个字符的数据 并 返回

	   int getc(FILE *stream); //功能与 fgetc 一样 ,但是他是宏函数。

       int getchar(void);  //从标准输入设备中获取一个字符的数据。 

		读取完毕或读取错误都会返回: 
		《EOF》  on end of file or error.


练习: 利用 fgetc 统计一个文件中  a  字符的个数。 



//输出数据 

#include <stdio.h>

       int fputc(int c, FILE *stream);  //把一个 int c 输出到 stream 中 
	   
	   int putc(int c, FILE *stream); //功能与 fputc 一样 他是一个宏函数 

       int putchar(int c); //把int c  输出到标准输出设备中 功能 等价于 
							
							fputc(int c,stdout);


-------------------------------------------------------------------------------------------------------



--------------------------------数据行操作--------------------------------------
数据行:每次操作数的时候都是操作一行数据   “\n” 

获取一行数据: 
     char *fgets(char *s, int size, FILE *stream);
	 //功能:从stream 中获取一行数据 (遇到\n就结束获取)
									 (但是可以指定获取的数据大小为size )

	 fgets: 他会自动在数据的末尾添加  '\0'   ,所以获取的有效数据为  size - 1 个 


	 char *gets(char *s);  //从标准输入设备中获取一行数据  (获取这行数据的大小??)



//练习:利用 fgets 改写 gets 使它不会出现断错误!!!! 

输出一行数据: 

    int puts(const char *s);  //把数据输出到标准输出设备中   , 自动添加换行符号


	int fputs(const char *s, FILE *stream); //把数据指定 输出到  stream 

----------------------------------------------------------------------------------------------------

-----------------------------------------格式化IO----------------------------------------------------

输出格式化操作: 
      #include <stdio.h>

       //功能:把 format 格式的数据,输出到标准输出设备中
	   int printf(const char *format, ...);
	   
	   //功能:把 format 格式的数据,输出 stream 中。 
       int fprintf(FILE *stream, const char *format, ...);
	   
	   //功能:把  format 格式的数据 输出到,str 地址上 
	   
       int sprintf(char *str, const char *format, ...);  (重要!重要!重要!)
	   1.数据类型的转换  
	   2.字符串的拼接  (strcat 只能拼接到后面)
	   
	   
	   
	   //功能: sprintf 一模一样,但是他可以指定数据的长度 更加安全
       int snprintf(char *str, size_t size, const char *format, ...);


--------------------------------------------------------------------------------
格式化数据的输入: 
#include <stdio.h>
//功能:从标准输入设备中获取 format 格式的数据 
int scanf(const char *format, ...);

//功能:从 stream 中获取 format 格式的数据 
int fscanf(FILE *stream, const char *format, ...);

//功能:从 str 地址中获取 format 格式的数据 
int sscanf(const char *str, const char *format, ...);  (重点,重点,重点)
1.做数据类型的转换  
2.做数据的切割

----------------------------------
format:操作格式 
%d    整形
%c    字符 
%f    浮点型 
%s    字符串类型 
%x    16进制类型 
%p    地址类型  
%u    无符号整形 
%o    8进制整形 
。。。
。。
----------------------------------

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值