简单的文件操作

Posted qiuyuwutong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了简单的文件操作相关的知识,希望对你有一定的参考价值。

前提:本文基于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("
");
25 
26     //关闭文件描述符
27     close(fd);
28     return 0;
29 }

 


























































以上是关于简单的文件操作的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段——git命令操作一个完整流程

VSCode自定义代码片段15——git命令操作一个完整流程

VSCode自定义代码片段15——git命令操作一个完整流程

创建自己的代码片段(CodeSnippet)

jQuery的DOM操作

为啥这段代码会泄露? (简单的代码片段)