目录
一、什么是IO
二、标准IO
1、标准IO
2、流
3、流的类型
4、缓冲区类型
三、标准IO相关库函数
1、打开文件 -- fopen
2、关闭文件 -- fclose
3、按字节读写 -- fgetc()/fputc()
4、按行读写 -- fgets()/fputs()
5、按对象读写
6、刷新流 -- fflush()
7、文件定位
8、判断错误流
一、什么是IO
比如你从磁盘中读取一个文件里面的内容,或创建一个文件写点内容保存到磁盘里
一句话,就是从一个设备中读read()数据到内存或者从内存写write()数据到这个设备。而这个设备就叫IO设备。
二、标准IO
文件类型:
普通文件-- '-'; 目录文件-- 'd'; 管道文件-- 'p'; 链接文件-- 'l'; 字符设备文件-- 'c'; 块设备文件-- 'b'; 套接字文件-- 's'; 注意:不同的操作系统适用的文件类型不同
1、标准IO
标准IO遵循ANSI C标准,标准IO实际是调用标准c库中的函数
特点:
标准IO利用缓冲机制,减少系统调用的次数,从而提高程序运行效率
标准IO--高级IO4
文件IO--低级IO
标准IO是在文件IO的基础上做的一次再封装
标准IO一般用于操作普通文件
2、流
数据仅是简单的从文件进行流入、流出,我把这种现象称为流
流在文件中用FILE结构体描述
grep -r "_IO_FILE" /usr/include -- 查找FILE结构体
struct _IO_FILE
{
char _IO_buf_base; /Start of reserve area. */
char _IO_buf_end; /End of reserve area. */
int _fileno;//文件描述符
}
在一个程序中,一个FILE结构体对应一份文件
三个特殊流:
标准输入流 "stdin" 键盘
标准输出流 "stdout" 终端
标准错误流 "stderr"
3、流的类型
流的类型有两种:文本流、二进制流
(1)文本流:
将数据转换为对应的ASCII码在进行存取
"1234"
49 50 51 52
(2)二进制流
将数据转换为二进制再进行存取
"1234"
1234 -->10011010010
文本流和二进制流处理换行符的方式
文本流:
将换行符转换'r'n'
二进制流:
换行符不做任何处理 -- 'n'
在Linux中,没有对文本流和二进制流做区分,换行符不做任何处理
4、缓冲区类型
(1)全缓冲:打开一个文件默认使用全缓冲,当缓冲区满或空时,才进行实际的IO操作
(2)行缓冲:当输入输出根终端相关时使用行缓冲,当缓冲区满或遇到换行符是才进行实际的IO操作
(3)无缓冲:跟错误输出相关时使用无缓冲
三、标准IO相关库函数
fopen()/fclose() --打开/关闭文件;
fgetc()/fputc() --按字节读写文件;
fgets()/fputs() --按行读写文件;
fread()/fwrite() --按对象读写文件;
ftell()/fseek()/rewind() --定位文件;
fflush() --刷新流;
feof() --判断错误流;
man手册:
1:shell指令和可执行程序
2:系统调用函数
3:标准库函数
1、打开文件 -- fopen
#include
FILE *fopen(const char *pathname, const char *mode);
参数:
pathname:打开文件的文件名(包含路径)
mode:打开文件的方式
r;以只读的方式打开文件
r+:以读写方式打开文件
w:以只写方式打开文件,如果文件不存在,则会先创建再打开
w+:以读写方式打开文件,如果文件不存在,则会先创建再打读
a:以只写方式打开文件,如果文件不存在,则会先创建再打开
a+:以读写方式打开文件,如果文件不存在,则会先创建再打开
返回值:
成功返回对应文件,失败返回NULL,并设置错误号(errno);
errno:当前系统中最后一个错误的编号
---------------------------------------------------
#include
char *strerror(int errnum);
参数:
errnum:错误号
返回值:
成功返回错误原因
----------------------------------------------------
perror:
#include
void perror(const char *s);
参数:
s:提示信息
2、关闭文件 -- fclose
#include
int fclose(FILE *stream);
参数:
stream:关闭文件对应的流指针
返回值:
成功返回0,失败返回-1;
3、按字节读写 -- fgetc()/fputc()
#include
int fgetc(FILE *stream);
参数:
stream:流指针
返回值:
成功返回读取的字符,失败返回-1;
读到文件末尾也会返回-1;
#include
int fputc(int c, FILE *stream);
参数:
c:输入的字符
stream:流指针
返回值:
成功返回写入的字符,失败返回-1;
4、按行读写 -- fgets()/fputs()
#include
char *fgets(char *s, int size, FILE *stream);
参数:
s:字符串首地址
size:请求读取数据的最大长度
stream:流指针
返回值:
成功返回得到字符串的首地址,失败返回NULL;
注意:
1、当读取内容遇到换行符,读取内容结束
2、最大读取内容为size-1个
#include
int fputs(const char *s, FILE *stream);
参数:
s:写入字符串的首地址
srteam:流指针
返回值:
失败返回-1;
练习:打开一个文件,统计该文件的行数
#include int fclose(FILE *stream); 参数: stream:关闭文件对应的流指针 返回值: 成功返回0,失败返回-1;
3、按字节读写 -- fgetc()/fputc()
#include
int fgetc(FILE *stream);
参数:
stream:流指针
返回值:
成功返回读取的字符,失败返回-1;
读到文件末尾也会返回-1;
#include
int fputc(int c, FILE *stream);
参数:
c:输入的字符
stream:流指针
返回值:
成功返回写入的字符,失败返回-1;
4、按行读写 -- fgets()/fputs()
#include
char *fgets(char *s, int size, FILE *stream);
参数:
s:字符串首地址
size:请求读取数据的最大长度
stream:流指针
返回值:
成功返回得到字符串的首地址,失败返回NULL;
注意:
1、当读取内容遇到换行符,读取内容结束
2、最大读取内容为size-1个
#include
int fputs(const char *s, FILE *stream);
参数:
s:写入字符串的首地址
srteam:流指针
返回值:
失败返回-1;
练习:打开一个文件,统计该文件的行数
#include char *fgets(char *s, int size, FILE *stream); 参数: s:字符串首地址 size:请求读取数据的最大长度 stream:流指针 返回值: 成功返回得到字符串的首地址,失败返回NULL; 注意: 1、当读取内容遇到换行符,读取内容结束 2、最大读取内容为size-1个
#include int fputs(const char *s, FILE *stream); 参数: s:写入字符串的首地址 srteam:流指针 返回值: 失败返回-1; 练习:打开一个文件,统计该文件的行数
5、按对象读写
#include
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
参数:
ptr;存放字符串的首地址
size:对象大小
nmemb:对象个数
stream:流指针
返回值:
成功返回读到个数,失败返回0;
#include
size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
参数:
ptr;存放字符串的首地址
size:对象大小
nmemb:对象个数
stream:流指针
返回值:
成功返回读到个数,失败返回0;
6、刷新流 -- fflush()
#include
int fflush(FILE *stream);
参数:
stream:流指针
返回值:
返回0,失败返回-1;
7、文件定位
#include
long ftell(FILE *stream);
功能:
返回文件指针相对于文件开头的偏移量
参数:
stream:流指针
返回值:
成功返回文件指针相对于文件开头的偏移量,失败返回-1
文件指针最后定位位置 == offset + whence
#include int fflush(FILE *stream); 参数: stream:流指针 返回值: 返回0,失败返回-1;
7、文件定位
#include
long ftell(FILE *stream);
功能:
返回文件指针相对于文件开头的偏移量
参数:
stream:流指针
返回值:
成功返回文件指针相对于文件开头的偏移量,失败返回-1
文件指针最后定位位置 == offset + whence
#include int fseek(FILE *stream, long offset, int whence); 参数: stream:流指针 offset:偏移量,可正可负 whence:基准点 SEEK_SET:将文件指针定位在文件开头 SEEK_CUR:将文件指针定位在当前位置 SEEK_END:将文件指针定位在文件末尾 返回值: 成功返回0,失败返回-1; 文件指针最后定位位置 == offset + whence
#include void rewind(FILE *stream); 功能: 将文件指针定位在文件开头



