一、文件的概念和类型
1、文件IO 与标准IO
- IO操作的就是文件。
文件基础:
一组相关数据的有序集合。
- Linux中常用的文件类型:
常规文件 r (.txt 二进制文件)
目录文件 d (文件夹)
字符设备文件 c
块设备文件 b
管道文件 p (进程间通信机制)
套接字文件 s (实现网络通信,进程间通信,本地通信)
符号链接文件 l
强调:不同的操作系统,支持的文件类型是不同的。
二、如何理解标准IO
- 标准I/O由ANSI C标准定义。 ----- 实际上就是 C库中已经定义好的一组输入输出的函数。
主流操作系统上都实现了C库。
标准IO通过缓冲机制减少系统调用,实现更高的效率。
缓冲机制:数据从文件中读出与写入不需要每次都去访问文件,中间加一个缓冲区,等到缓冲区满足某一个条件将缓冲区中的数据一次性写入文件中,减少访问文件的次数,提高效率。
系统调用:代码 控制硬件 之间有一层操作系统 统一 分配调用。
三、流(FILE)的含义(了解)
- FILE :
标准IO用一个额结构体类型来存放打开的文件的相关信息。
标准I/O的所有操作都是围绕FILE来进行。
- FILE又被称为 流(stream)
流(stream): 文本流 和二进制流
Windows 中 区分文本流和二进制流
二进制流:换行符 ‘\n’
文本流: 换行符 ‘\r’ ‘\n’
Linux 中:
换行符 ‘\n’
四、流的缓冲类型(熟练)
- 全缓冲:
当流的缓冲区无数据或无空间时才执行实际I/O操作。标准I/O中,打开一个普通文件默认的缓冲类型就是------ 全缓冲。
- 行缓冲:--- 标准输入/输出流 是典型的行缓冲。
当再输入和输出中遇到换行符(“\n”)时,进行I/O操作。
当流个一个终端关联时,典型的行缓冲。
- 无缓冲:
数据直接写入文件,流不进行缓冲 ------ 将一些错误直接打印到终端上。
五、小结
标准I/O — Stdin,stdout stderr
标准I/O预定义3个流,程序运行时自动打开;
理解标准IO :实际时标准C库中定义的一组 API
流的缓冲类型:全缓冲,行缓冲 ,无缓冲
Stdin stdout stderr : 程序打开会自动创建。
六、流的打开
- 下列函数可用于打开一个标准I/O流:
FILE *fopen(const char *path ,const char *mode);
参数:const char *path :指定要打开文件的路径。
Const char *mode:指定流的打开方式(有六种不同的流的打开方式)
成功时返回流指针,出错时返回NULL
标准I/O — fopen – 实例
#include <stdio.h>
Int main(int argc,char *argv[])
{
FILE *fp;
If((fp = fopen(“test.txt”,”r+”)) == NULL){
Printf(“open error \n”);
Return -1;
}
……….
Return 0;
}
标准I/O – fopen - 新建文件权限
- Fopen() 创建的文件访问权限是0666(rw-rw-rw-)可读可写不可执行
A --- 0 八进制
- Linux系统中umask(存放文件权限掩码,默认022)设定会影响文件的访问权限,其规则为(0666 &~umask)----- 文件初始权限与取反后的umase中的掩码 相与 得到文件最终的权限。
- 用户可以通过umask 函数修改相关设定
- 标准I/O – 处理错误信息
Errno 错误号为1 时:没有权限
Errno 错误号为11 时:没有资源
- extern int errno;
void perror (const char *s);
char *strerror(int errno);
— errno 存放错误号
— perror 先输出字符串s,再输出错误号对应的错误信息。
— sterror 根据错误号返回对应的错误信息。
示例1:
#include <stdio.h>
int main (int argc ,char *argv[])
{
FILE *fp;
if((fp = fopen("test.txt","r++")) == NULL)
{
perror("fopen");
return -1;
}
...............................
}
输出:fopen:No such file or directory
示例2:
#include <stdio.h>
#include <string.h>
#include <errno.h>
int main (int argc ,char *argv[])
{
FILE *fp;
if((fp = fopen("test.txt","r++")) == NULL)
{
printf("fopen : %s \n",strerror(errno));
return -1;
}
...............................
}
输出:fopen:No such file or directory
七、流的关闭
- Int fclose(FILE *steam);
Fcose()调用成功返回0 ,失败返回EOF,并设置errno
流关闭时自动刷新缓冲中的数据并释放缓冲区。
当一个程序正常终止时,所有打开的流都会被关闭。(最好手动关闭掉)
流一旦关闭后就不能执行任何操作。
- 思考与练习:
程序中能够打开的文件或流的个数有限制,如何测试?
思路:循环打开流,成功则计数累加,直到出错为止,
答案:1021+stdin+stdout+stderr = 1024.