Linux 基础IO 1
文件操作
基础IO
在程序中若需要读取文件数据或者将数据永久存入需要使用文件因为程序的产生的数据都是在内存中的,只要关闭程序就会释放掉不会,所以在一些程序中我们难免需要对文件进程操作。无论我们是存入数据还是提取数据前提是有这个数据并清楚它在什么地方。
在进程3中我们了解到了有文件文件描述符,而且当使用printf函数scanf函数或是c++的cout,cin都能读取到键盘的数据或者能向显示器写入数据,这就是因为在每个进程打开的时候操作系统都会默认打开三个文件,分别是输入,输出和错误输出文件所以每个进程都会有这三个文件描述符:0,1,2对应输入输出和错误输出,这三个文件也可以理解为是缓冲区。
每当我们在键盘上按下某个键时就会将这个数据存放进输入缓冲区即0号文件然后我们使用scanf或者cin的时候就会从这个文件中读取数据。
当我们使用printf或者cout在屏幕上打印进程的数据时其实就是向1号文件写入数据,然后通过刷新缓冲区将数据冲刷到屏幕上而显示出来。错误输出与这个同理只不过他只输出进程错误的信息。
所以我们就能知道printf和scanf的工作原理了其实就是按某些标准格式向文件写入数据和取出数据。
open与fopen打开文件
上面我们提到了在进程创建的时候操作系统都会为其打开三个文件0,1,2。那么我们怎么在程序内打开文件呢,就是使用open与fopen函数打开。
open:
open是一个系统调用函数,可以理解为操作系统就是通过这个函数的功能来打开的然后在进程PCB中的文件指针所指向的结构体files struct里面的指针数组中找到最小下标的空位置创建一个指针指向我们打开的文件的信息结构体file struct。这样就完成了对于进程打开一个文件的操作了。
使用open需要包含的头文件:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
open函数原型:
int open(const char *pathname,int flags);
int open(const char *pathname,int flags,mode_t mode);
第一个参数是需要打开的文件的路径和文件名。如:usr/bin/pwd
第二个参数是对文件的操作方式:
O_RDONLY 只读打开
O_WRONLY 只写打开
O_RDWR 可读可写打开
O_CREAT:若文件不存在则创建
O_EXCL:如果同时指定了O_CREAT,而文件已经存在,则出错(返回-1)
O_APPEND:每次写时都加到文件的尾端
里面有些是可以并存的,方式是:O_RDWR|O_CREAT 就是以读写方式打开若文件不存在就创建,我们知道 | 是按位或操作符这里使用这个的原因就是这里用的就是位图,这些值都是一些宏,定义在<fcntl.h>这个头文件中,这些数据都是2的次方也就是”000001“,”00000010“,”0000010000“这样的数据所以这里用的是 | 。
第三个参数一般和创建文件一起使用是指定文件操作权限的,若不知道则按照当前操作系统设置的默认权限。如:写个0600那么就是仅拥有者可以读写,若是写个0666就是所有人都可以读写。
lseek函数是调整文件偏移量的函数,打开文件后若我们进行了读写那么偏移量会被改变,刚打开时偏移量为0就是文件开头的位置,然后我们进行读写会根据读写的数据量进行偏移,也就是当前读取或写入的位置的下一个,所以若我们在文件中写入数据后需要读取其数据需要用lseek函数将其偏移量重新置为初始位置
头文件:
#include <sys/types.h>
#include <unistd.h>
lseek函数原型
off_t lseek(int fd, off_t offset, int whence);
函数参数:
fd:文件描述符
offset:字节数,以whence参数为基点解释offset(偏移量)
whence:解释offset参数的基点:
SEEK_SET:文件偏移量设置为offset(开头)
SEEK_CUR:文件偏移量设置为当前文件偏移量加上offset,offset可以为 负数(末尾)
SEEK_END:文件偏移量设置为文件长度加上 offset,offset可以为负数
第二三个参数是配合使用的,若我们设置第三个参数为SEEK_SET, 就是从开头位置开始偏移offset个字节。
fopen:
fopen是一个c标准库的函数,在不同平台可能实现不同但是用法都一致
头文件:
#include <stdio.h>
函数原型
FILE *fopen(const char *filename, const char *mode);
参数:
filename:文件的路径。
mode:文件打开模式,常用的模式有:
"r":以只读模式打开文件。
"w":以只写模式打开文件,若文件存在则清空文件内容。
"a":以追加模式打开文件。
"r+":以读写模式打开文件。
"w+":以读写模式打开文件,若文件存在则清空文件内容。
"a+":以读写追加模式打开文件。
这里的返回值是一个FILE* 文件结构体的指针而不是文件描述符,其用法基本一致。