基础概念:
1.linux文件的分类:
普通文件 -
目录文件 d
套接字 s
块设备 b
字符设备 c
链接文件 l
管道文件 p
2.系统调用
概念:用户访问内核的接口
作用:提高安全性
3.流的概念:
所有的IO操作仅仅简单的从程序移进或移出,这种字节流,就是流.
分类:
文本流/二进制流 (Linux不区分);
三个特殊流:(也会触发系统调用) (也是文件描述符)
标准输入 键盘 stdin 0
标准输出 屏幕 stdout 1
标准错误输出 屏幕 stderr 2
每在linux下用键盘输入一个字符,就触发一次标准输入和标准输出
4.缓冲区
是内存的一部分,是使内存预留的一部分空间.
作用:解决速率不匹配问题
缓冲区的分类:
1)全缓冲:主要针对普通文件,没有'\n',一次性的全
只有当缓冲区域满的时候,才会执行IO操作
2)行缓冲:标准输入
当缓冲区满或者遇到'\n',\n前的内容先刷新到缓冲区,\n后的内容遇到第二个\n才会刷新否则等到程序结束才刷新进缓冲区
3)不缓冲:标准错误输出
直接输出
缓冲区的刷新条件:
1.程序结束的时候,正常结束时,而不是被信号结束,要用return;
2.缓冲区满的时候
3.关闭文件的时候(关闭流关闭时)
4.行缓冲(遇到 '\n');
5.fflush();
#include <stdio.h>
int fflush(FILE *stream);
//强制刷新缓冲区
参数:流
返回值:成功返回流,失败返回-1;
二\标准IO
1)打开文件
fopen();
#include <stdio.h>
FILE *fopen(const char *pathname, const char *mode);
FILE:每个被使用的文件都在内存中开辟一个区域,用来存放文件的有关信息,这些信息是保存在一个结构体类型的变量中,该结构体类型是由系统定义的,取名为FILE。
参数:
pathname:文件路径名
mode:打开方式
r 只读的方式打开,文件必须存在
r+ 读写方式打开,文件必须存在
w 只写的方式打开,文件不存在则创建,存在则清空
w+ 读写的方式打开,文件不存在则创建,存在则清空
a 追加写的方式打开,文件不存在则创建,存在则追加写
a+ 追加读写方式打开,文件不存在则创建,存在则追加写
返回值:
成功返回FILE指针,失败返回NULL
2)读写文件
1.按字符读写 fgetc和fputc
读:
#include <stdio.h>
int fgetc(FILE *stream);//从stream指定文件中读取一个字符,是一个函数
int getc(FILE *stream);
//从stream指定文件中读取一个字符,是一个宏
int getchar(void);
//从标准输入中读取一个字符
返回值:
成功返回一个字符
失败或者读到文件末尾返回EOF;
int feof(FILE *stream);
//判断是否到达文件末尾
返回值:如果检测到末尾指示器(end - of -file indicator)被设置,返回非0值
如果检测不到末尾指示器(end - of -file indicator)被设置,返回值为0
末尾指示器只能使用clearerr函数清除
int ferror(FILE *stream);
//判断是否出错
返回值:出错返回非0;
写:
#include <stdio.h>
int fputc(int c, FILE *stream);//向stram指定文件中写入一个字符,是一个函数
int putc(int c, FILE *stream);
//向stram指定文件中写入一个字符,是一个宏
int putchar(int c);
//向标准输出写入一个字符
返回值:
成功返回一个字符,失败EOF
2.按行读写 fgets和fputs
char *fgets(char *s, int size, FILE *stream);
//从stream指定文件中读取一行数据,存放到s指定的内存中,
//最多存size -1 个字符(因为不读尾零所以-1)
//注意: 在读取数据的时候会连同'\n'一起读入到缓冲区中,在末尾补'\0'作为结束标志,当读到‘\n’或者文件结束符(EOF)会结束读取
参数:
s:缓冲区首地址
size:实际读到的个数(也是返回的指针每次获得的字符量的大小,若size大于file中一行的字符数,则一次性得到这一行的全部字符)
stream:流指针
返回值:
成功返回缓冲区首地址,如果在读取字符的过程中遇到EOF,则eof指示器被设置;如果未读入任何字符就遇到EOF,则 s 参数指向的位置保持原来的内容,返回值为NULL
如果在读取的过程中发生了错误,则error指示器被设置,返回NULL,但是s参数指向的内容可能被改变
char *gets(char *s)
//默认从键盘读取一行数据到s指定的内存中,因为没有指定内存的大小,
//容易造成内存泄漏,所以不安全
写:
int fputs(const char *s, FILE *stream);
//向stram指定文件中写入一行数据
返回值:
成功返回非0,失败EOF
int puts(const char *s);
//默认向标准输出写入一行字符,自动添加换行符.
3.按块读写 fread和fwrite
读
#include <stdio.h>
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
//从指定的文件中读取指定尺寸的数据
//stram指定文件中读取一组数据,存放在ptr指向的内存中
ptr:指向存放数据的内存块指针,该内存块的尺寸最小为size * nmemb 个字节
size:指定要读取的每个元素的尺寸,最终的尺寸为size * nmemb
nmemb:指定要读取的元素个数,最终的尺寸为size * nmemb
stream:FILE对象的指针,指定一个带读取的文件流
ptr从file中获得size * nmemb 的字符,若超过该行的字符数,用%s打印ptr会出现乱码
但是一个一个打印ptr中的内容可以得到 size * nmemb 个有效字符,不能通过读得到
ptr内的内容(存疑)
参数:
ptr:数据保存的首地址
size:读取数据的大小
nmemb:对象个数
stream:流指针
返回值:
为实际读取到的元素个数,如果返回值比nmemb小,表示可能读取到文件末尾或者发生错误,可以用feof函数或者ferror函数作进一步的判断
失败返回0;
写:
size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
参数:与fread同
ptr:数据保存的首地址
size:写入数据的大小
nmemb:对象个数
stream:流指针
返回值:
成功返回实际写入的个数
失败返回0;
3)关闭文件
fclose(); //关闭流
4.流的定位和修改
int fseek(FILE *stream, long offset, int whence);
//修改文件指针当前的位置
参数:
stream:文件指针
offset:相对于第三个参数的偏移量
whence:第二个参数偏移的起始位置
SEEK_SET ---- 文件的起始位置
SEEK_CUR ---- 读或写指针当前的位置
SEEK_END ---- 文件结束的位置
返回值:
成功返回0失败返回-1
long ftell(FILE *stream);
//获取当前文件指针相对于文件起始位置的字节数
返回值:
相对于文件起始位置的偏移量,失败返回-1