【1】标准IO
1. 概念:
标准IO是指在C库中提供的一组专门用于输入输出的函数
2. 特点:
不仅在UNIX系统,在很多操作系统上都实现了标准I/O库
标准I/O库由ANSI C标准说明
标准I/O通过缓冲机制减少系统调用,实现更高效率
标准I/O在系统调用函数基础上构造的,它便于用户使用
标准IO默认打开了三个流:stdin、stdout、stderr
3. FILE:(文件流指针)
每个被使用的文件都在内存中开辟一个区域,用来存放文件
的有关信息,这些信息是保存在一个结构体类型的变量中,
该结构体类型是由系统定义的,取名为FILE。
标准I/O库的所有操作都是围绕流(stream)来进行的,
在标准I/O中,流用FILE *来描述。
4. 流:
定义:所有的I/O操作仅是简单的从程序移进或者移出,
这种字节流,就称为流
【2】缓存区:
1.全缓存:与文件相关
刷新缓存区的条件:
1)程序正常退出
2)缓存区满刷新
3)fflush强制刷新
2.行缓存:与终端相关
刷新缓存区的条件:
1)\n刷新
2)程序正常退出
3)缓存区满刷新
4)fflush强制刷新
3.不缓存:没有缓存区,stderr
练习:测试标准输出缓存区的大小
1Byte*1024=1K
Byte KB MB GB:
1GB = 1024MB
1MB = 1024KB
1KB = 1024Byte
【3】打开文件:
FILE *fopen(const char *path, const char *mode);
功能:打开文件
参数:path:文件路径
mode:打开文件的方式
r:只读,文件不存在,会报错
r+:可读可写,文件不存在,会报错
w:只写,文件不存在创建,文件存在清空
w+:可读可写,文件不存在创建,文件存在清空
a:追加(可写),文件不存在创建,存在追加
a+:可读可写,文件不存在创建,存在追加
返回值:成功:返回文件流指针
失败:NULL
FILE *freopen(const char *pathname, const char *mode, FILE* fp)
功能:将指定的文件流指针重定向到打开的文件中
参数:path:文件路径
mode:打开文件的方式(同上)
fp:文件流指针
返回值:成功:返回文件流指针
失败:NULL
关闭文件:
int fclose(FILE *fp);
补充:
void perror(const char *s);
功能:当你调用“某些”函数出错时,会将参数 s 所指的字符串和错误的原因输出到标准设备。
char *strerror(int errnum);
功能:根据错误号返回错误原因字符串
参数:errnum:errno号
int fprintf(FILE *stream, const char *format, ...);
功能:向指定的流中输出数据
练习:测试一个进程最多可以打开多少个文件
【4】每次一个字符的读写:
int fgetc(FILE *stream);
功能:每次一个字符的读
参数:stream:文件流指针
返回值:成功:读到字符的ASCII
失败或文件结尾:EOF(-1)
int fputc(int c, FILE *stream);
功能:向指定的文件中写一个字符
参数:c 要写的字符
stream 要写到的流
返回值:成功:写入的字符;
失败:EOF
练习:用fgetc和fputc实现cat的功能,从命令行输入文件名.
【5】每次一行的IO:
char *fgets(char *s, int size, FILE *stream);
功能:从指定的流中读取最多size-1个字符,
存放在s所指的空间
参数:s 读到数据的存放位置
size 一次期望读到的数据
stream 流
返回值:成功返回s的地址
失败或读到文件结尾:NULL
int fputs(const char *s, FILE *stream);
功能:向指定的文件流中写入一串字符
参数:s:要写入的字符内容
stream 流
返回值: 成功 实际写入的数据的个数
失败 EOF
注意:
fgets最多可以读size - 1个,最后一个字符必须是'\0'字符
fgets函数是每次读一行的函数,遇到'\n'字符返回
练习:用fgets实现wc –l的功能,文件名从命令行输入
* buf:*\n\0 2-1=1
** buf:**\n\0 3-1
*** buf:***\n\0
**** buf:**** buf:\n\0
***** buf:**** buf:*\n\0
****** buf:****\0 buf:**\n\0
buf:\n\0
假设:size=5
buf[strlen(buf)-1]
练习:用fgets和fputs实现cp的功能,两个文件名从命令行输入
cp 文件1 文件2
【6】直接IO(二进制IO)
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
功能:从文件流读取多个元素
参数: ptr :用来存放读取元素
size :元素大小 sizeof(数据类型)
nmemb :读取元素的个数
stream :要读取的文件
返回值:成功:读取的元素的个数;读到文件尾: 0
失败: -1
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
功能:按对象写
参数:同上
返回值:成功:写的元素个数
失败 :-1
注意:
两个函数的返回值为:读或写的对象数
对于二进制数据我们更愿意一次读或写整个结构
练习:通过fread和fwrite读写一个结构体数组
回顾:
1.标准IO 概念\特点\缓存
2.标准IO相关函数:
fopen/freopen
fclose
fgetc/fputc
fgets/fputs
fread/fwrite
rewind