回忆C语言IO:
在C语言里面,对文件的操作主要是通过fopen()和fclose()函数进行的, FILE* fopen(char*filename,char*type);
其中type表示的是需要对文件的操作类型。
int fclose(char*filename);在C语言里面对文件进行IO操作的时候C语言会默认打开三个输入输出流,分别是stdin,stdout,stderr,三个输入输出流返回类型都是FILE*。
系统文件IO:
操作文件,除了上面的C语言接口,我们还可以采用系统接口来进行文件访问
open() 若函数执行成功返回一个新的文件描述符(一个非负的小整数),若执行失败机会返回-1。
filename:需要打开或创建的目标文件。
flags:打开文件是的文件参数。
flag:是用来表明文件的操作方式,主要有以下几种:
O_RDONLY:文件只读打开
O_WRONLY:文件只写打开
O_RDWR:文件读写打开
O_CREAT:若文件不存在,将创建一个新文件,新文件的所有者将会被设置为当前用户
O_EXCR:必须和O_CREAT一起使用,当文件存在的时候报错,不存在的时候创建。
O_TRUNC:如果一个文件是普通文件,打开模式是可写,会将文件长度置0,丢弃现有的内容。
O_APPEND:文件追加模式。在写之前将文件的读写指针置在我文件的末尾,新的文件将写到文件的末尾。
#include
#include
#include
#include
#include
#include
int main()
{
int fp = open("hehe.txt",O_WRONLY|O_CREAT,0644);
if(fp < 0)
printf("open()");
else
printf("ok\n");
close(fp);
return 0;
}
文件的写操作:
ssize_t write(int fd, const void *buf, size_t count);
其中fd——–>目前不知道,后面补充
buf——->缓冲区首地址
len——–>期望写入的字节数
当write函数执行成功之后会返回成功被写入字节的个数。
举个栗子:
int main()
{
int fp = open("hehe.txt",O_WRONLY|O_CREAT,0644);
if(fp < 0)
printf("open()");
else
printf("ok\n");
char *buf = "hello word!";
int r = write(fp, buf, strlen(buf));
if(r == -1)
exit(1);
else
printf("ok\n");
close(fp);
return 0;
}
读取文件:
ssize_t read(int fd, void *buf, size_t count);
fd——->以后补充
buf——>缓冲区首地址
count——>期望一次读出文件的字符数
read() 函数调用成功返回值为成功读取文件的字符数,若失败则返回-1。
举个栗子:
int main()
{
char buf[15];
int fd = open("hehe.txt",O_RDONLY,0644);
read(fd,buf,10);
printf("%s\n",buf);
}
文件描述符:
在上面提到的fd就是文件提示符,文件提示符就是小整数,linux进程在默认情况下会有三个文件描述符,0 、1、2,分别是标准输入、标准输出和标准错误。
文件描述符的理解:在系统打开文件的时候就会需要相应的结构体来描述相关的文件,于是就有了在每个进程里面都会含有一个files*,这个files*指向一个file_struct,file_struct其实是一个表,这个表包含一个指针数组,每个指针数组的指针都指向一个打开的文件的指针,这个文件描述符就是这个文件指针的下标,所以当我们可以拿到这个文件描述符的时候就可以间接的找到系统打开文件的位置。
如图:
文件描述符的分配规则:
在系统分配文件描述符的时候,总是在上面提到的指针数组里面找到未被使用的最小的下标,作为当前文件的文件描述符。
举个栗子:
int main()
{
//close(1);
int fd = open("hehe.txt",O_RDONLY|O_CREAT ,0644);
int fp = open("haha.txt",O_RDONLY|O_CREAT,0644);
int ft;
printf("%d\n",fd);
close(fd);
ft = open("csdn.txt",O_RDONLY|O_CREAT,0644);
printf("%d\n",ft);
return 0;
}
案例:
当我们close(1)
时候,在打开一个文件,比如open("myfile",O_REONLY|O_CREAT, 0644);
的时候就会发现,本应该输出到标准输出的数据被输出到了myfile
里面,因为在linux系统里面文件表示符1代表着标准输出,但是我们将文件标识符1关闭之后,新打开的文件就会占用1号文件表示符,这时候当我们想输出的时候就会将文件内容输出到myfile
里面了。
举个栗子:
int main()
{
close(1);
int fd = open("hehe.txt",O_RDONLY|O_CREAT ,0644);
printf("hehe\n");
close(fd);
return 0;
}