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进制整形
。。。
。。
----------------------------------