简单的文件操作
前提:本文基于LInux系统的编程与学习
使用系统调用对文件进行操作。
open(2) close(2) read(2) write(2) lseek(2)
文件描述符。
进程 进程的本质是对程序执行的过程中,对计算机资源使用情况的描述。
每个进程都有自己的pid。每个进程都有自己的户口本。户口本里记录了进程对资源的使用情况。进程的户口本专业术语叫PCB(进程控制块)。
文件描述符是记录在PCB的成员中<数组的下标>
int open(const char *pathname, int flags,...);
功能:打开(有可能创建)一个文件
参数:
pathname:指定了要打开的文件的路径
flags:
3选1
O_RDONLY:只读
O_WRONLY:只写
O_RDWR: 读写
O_CREAT:如果文件不存在,创建文件。第三个参数指定了新文件的权限。
O_EXCL:这个和上个标记一起被使用的时候。当创建一个新文件的时候,文件存在,报错。如果文件不存在,创建一个新的文件。
O_TRUNC:创建文件的时候,如果文件存在,将文件的内容清0.
O_APPEND:以追加方式打开文件,文件的写的位置定位在文件的末尾。
...:可变参数。
返回值:
成功 返回新的文件描述符
错误 -1 errno被设置
close(2)
#include <unistd.h>
int close(int fd);
功能:关闭文件描述符
参数:
fd:指定了要被关闭的文件描述符
返回值:
成功 0
错误 -1 errno被设置
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
功能:从指定的文件描述符读取数据
参数:
fd:指定文件描述符,从该文件描述符读取数据
buf:存放读取数据的内存的首地址
count:最多读取的字节数,请求读取的字节数
返回值:
错误 -1 errno 被设置
成功 返回读取的字节数 (0代表文件的末尾) 如果返回值小于请求的字节数,这不是错误。说明已经接近文件的末尾
#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);
功能:把数据写入到一个文件描述符
参数:
fd:指定了目标文件描述符 向该文件描述符中写数据
buf:存放数据的缓冲区的位置,将buf指定的缓冲区中的数据写到文件中
count:申请的写入的字节数
返回值:
错误 -1 errno被设置
成功 写入的字节数 (0代表什么都没做) 如果返回的字节数小于申请的字节数,不是错误,这可能是由于磁盘空间已经满了
#include <sys/types.h>
#include <unistd.h>
off_t lseek(int fd, off_t offset, int whence);
功能:重新定位文件的读写位置
参数:
fd:要操作的文件的描述符
offset:指定了字节数,具体的读写位置需要这个参数和whence一起决定
whence:
SEEK_SET The offset is set to offset bytes.
读写的位置=0+offset
SEEK_CUR The offset is set to its current location plus
offset bytes.
读写位置=当前位置+offset
SEEK_END The offset is set to the size of the file plus
offset bytes.
读写位置=文件的大小+offset
返回值:
错误 -1 errno被设置
成功 偏移位置的字节数。相对于文件的头部
1 #include <stdio.h> 2 #include <sys/types.h> 3 #include <sys/stat.h> 4 #include <fcntl.h> 5 6 int main(int argc,char *argv[]){ 7 //打开文件,以只读方式打开文件 8 int fd=open(argv[1],O_RDONLY); 9 if(fd==-1){ 10 perror("open"); 11 return -1; 12 } 13 //定位到第一个空格 14 lseek(fd,6,SEEK_SET); 15 //从文件读取四个字节的数据 16 int buf; 17 read(fd,&buf,sizeof(int)); 18 //将读取到的数据输出 19 char *p=(char *)&buf; 20 printf("%c",*p++); 21 printf("%c",*p++); 22 printf("%c",*p++); 23 printf("%c",*p++); 24 printf("\n"); 25 26 //关闭文件描述符 27 close(fd); 28 return 0; 29 }