一、Linux系统的七种文件类型
一切皆是文件
b block 块设备文件 (文件IO)
c character 字符设备文件 (文件IO)
d directory 目录文件 (目录IO)
- 普通文件 (标准IO、文件IO)
l link 链接文件 (链接IO)
s socket 套接字文件 (文件IO)
p pipe 管道文件 (文件IO)
二、标准IO:程序通过调用函数与内核交互,有缓存
标准IO函数接口:头文件stdio.h
putchar、getchar、puts、gets、printf、scanf
fopen/fclose、fgetc/fputc、fgets/fputs、fread/fwrite、fscanf/fprintf
文件IO:程序直接与内核进行交互
1.普通文件类型:
(1)ASCII码文件
文件中存放的数据都是能显示在终端上的字符组成
(2)二进制文件
文件中存放的数据不一定都是能够显示在终端的字符
注意:ASCII码文件是一种特殊的二进制文件
2.流:
(1)有方向性
(2)具有连续性
(3)先进先出、后进后出特性
3.操作文件步骤:
(1)打开文件
(2)写入/读出
(3)关闭
4.函数接口:
(1)fopen
FILE *fopen(const char *pathname, const char *mode);
功能:
打开文件并与其建立流
参数:
pathname:要打开文件名的字符串首地址
mode:打开文件权限
r 只读 文件存在只读打开 文件不存在报错
r+ 读写 文件存在读写打开 文件不存在报错
w 只写 文件存在,对文件清0,只写打开 文件不存在,创建文件,只写打开
w+ 写读 文件存在,对文件清0,写读打开 文件不存在,创建文件,写读打开
a 追加只写 文件存在,追加只写打开 文件不存在,创建文件,只写打开
a+ 追加读写 文件存在,追加读写打开 文件不存在,创建文件,读写打开
返回值:
成功返回打开获得的文件流指针
失败返回NULL
perror("fopen failed!");
不支持像printf一样用格式化控制字符输出,但优点是可以打印出错信息到stderr(标准出错流)
适用于Linux,比如系统函数read,write,socket等;
(2)fclose
int fclose(FILE *stream);
功能:
关闭流
参数:
stream:文件流指针
返回值:
成功返回0
失败返回EOF(-1) EOF表示END OF FILE
注意:如果不手动关闭,程序结束会帮你自动关闭,但是一般用完文件后需要自己关闭,否则会造成内存泄漏(之前的fopen时系统自动为fp开辟了空间);
5.三个特殊流:
程序运行时,操作系统会默认打开三个流:
stdin 标准输入流 gets getchar scanf
stdout 标准输出流 puts putchar printf
stderr 标准出错流 perror
注意:fclose();函数可以关闭这三个流
6.缓存:
1.缓存类型:
(1)全缓存 4k == 4096
(1)程序结束刷新
(2)缓存区满刷新
(3)fflush函数刷新
与文件建立的缓存一般为全缓存,所以每次后续进行读写操作时会首先char tmpbuff[4096];
(2)行缓存 1k == 1024
(1)程序结束刷新
(2)缓存区满刷新
(3)fflush函数刷新
(4)遇到\n刷新
与终端建立的缓存一般为行缓存,如stdout stdin
(3)不缓存 0k
立即刷新
人机交互、界面控制、出错处理一般使用不缓存,如stderr
2.改变缓存类型
setvbuf
int setvbuf(FILE *stream, char *buf, int mode, size_t size);
功能:
修改文件流指针的缓存类型
参数:
stream:文件流指针
buf:指定缓存空间首地址
mode:
_IONBF(IO NOT BUF) 不缓存
_IOLBF 行缓存
_IOFBF 全缓存
size:
指定缓存区大小
返回值:
成功返回0
失败返回非0
7.流的读写函数
1.fputc和fgetc
应用场景:
操作ASCII码文件、操作单个字符
(1)fputc
int fputc(int c, FILE *stream);
功能:
向流中写入一个字符
参数:
c:写入文件中字符的ASCII码值
stream:文件流指针
返回值:
成功返回写入字符的ASCII码值
失败返回EOF(-1)
注意:
1.fputc写入文件中的是字符
2.fputc写入一个字符
(2)fgetc
int fgetc(FILE *stream);
功能:
从流中读取字符
参数:
stream:文件流指针
返回值:
成功返回读取字符的ASCII码值
失败返回EOF(EOF是针对于读的,一般会读到文件末尾,结束)
读到文件末尾返回EOF
2.fputs/fgets
应用场景:
只能操作ASCII文件、操作字符串
(1)fputs
int fputs(const char *s, FILE *stream);
功能:
向流中写入字符串(不会写入s中的\0)
参数:
s:写入字符串的首地址
stream:文件流指针
返回值:
成功返回非负整数
失败返回EOF
(2)fgets
char *fgets(char *s, int size, FILE *stream);
功能:
从流中读size个字符,遇到EOF或者\n读取停止
参数:
s:存放读取到字符串空间首地址
size:想要读取字符的个数
stream:文件流指针
返回值:
成功返回读取到字符串存放空间的首地址
失败返回NULL
读到文件末尾返回NULL
gets(tmpbuff);
fgets(tmpbuff, sizeof(tmpbuff), stdin);
注意:
gets会去掉从终端接收的\n字符
fgets不会去掉从终端接收的\n字符
8.主函数传参:
int main(void);
void main(void);
int main(int argc, const char *argv[]);
int main(int argc, const char **argv);
argc是执行程序时,传入参数的个数;
argv是一个指针,分别指向传入字符串的首地址;
本期的分享就到此结束啦!不懂的或者需要源码的同学们可以滴滴我交流哦!(qq:1462161851)