Linux 文件操作基本命令

在Linux文件操作中,最常用的基本命令包括:打开或者创建文件,写入文件,读取文件

下面将依次介绍这几种操作的常用方法。

1.打开/创建文件

首先说明在VI编辑模式中,若要使用该API,需包含相应的头文件,这些头文件不需要用户死记硬背,只需用户通过man指令查询即可,例如常用的malloc函数,用户可通过指令man malloc 即可查询该函数的基本用法。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5ZOG5ZWm5a2m57yW56iL77yB,size_20,color_FFFFFF,t_70,g_se,x_16 watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5ZOG5ZWm5a2m57yW56iL77yB,size_20,color_FFFFFF,t_70,g_se,x_16

从man指令执行结果可以看到该函数的原型,包括所使用的头文件为#include<stdlib.h>,在DESCRIPTION栏中可以看到该函数的具体各个参数的含义及用法。下面就用man指令来查询文件操作常用函数的用法。

文件的打开/创建函数为open函数,下面我们来查询下该函数的具体用法(在此注意,open函数查询指令为man 2 open)

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5ZOG5ZWm5a2m57yW56iL77yB,size_20,color_FFFFFF,t_70,g_se,x_16

从SYNOPIS中可以找到该函数所需要的头文件,在DESCRIPTION中可以找到各个参数的相关含义及其用法。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5ZOG5ZWm5a2m57yW56iL77yB,size_20,color_FFFFFF,t_70,g_se,x_16

 ​​​​在open函数中有以上两种原型,第二种相对于前一个多了一个mode_t mode参数,第一个参数const char *pathname为 文件名,指向文件路径,指明用户需要打开哪个文件。 

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5ZOG5ZWm5a2m57yW56iL77yB,size_20,color_FFFFFF,t_70,g_se,x_16第二个参数int flags 为权限参数,其中包括O_RDONLY(只读许可),O_WRONLY(只写许可),O_RDWR(可读可写)。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5ZOG5ZWm5a2m57yW56iL77yB,size_20,color_FFFFFF,t_70,g_se,x_16 open的返回值,也称文件描述符,相当于索引,打开哪个文件就对应哪个索引,如果文件打开失败,则返回值为-1.

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include<stdio.h>

int main()
{
        int fd;
        fd=open("./file1",O_RDWR);
        printf("fd=%d\n",fd);
}

 在以上代码中,前三个头文件为open 所需,最后一个为标准输入输出所需。整型变量fd为文件描述符。运行结果如下:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5ZOG5ZWm5a2m57yW56iL77yB,size_19,color_FFFFFF,t_70,g_se,x_16

 再比较open函数第二种原型的用法。当我们打开的文件不存在的时候,需要创建相应的文件才能成功打开,此时我们的第二个参数就需要再添加一项创建的权限O_CREAT,同时第三个参数也需要给出mode值,其中0600代表可读可写权限,这里说明4为可读参数,2为可写参数,所以二者相加为6可读可写,其他位数字参数用户可自行查阅手册。

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include<stdio.h>

int main()
{
        int fd;
        fd=open("./file1",O_RDWR);
        if(fd==-1){
                printf("open file1 failed\n");
                fd=open("./file1",O_RDWR|O_CREAT,0600);
                if(fd>0){
                        printf("creat file1 successd\n");
                }

        }
}

 watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5ZOG5ZWm5a2m57yW56iL77yB,size_18,color_FFFFFF,t_70,g_se,x_16

这里需要说明,若用户之前已经创建了文件file1,则需要先将其删除才能得到创建的结果。

2.写入文件 

写入文件用到的函数为write函数,函数原型如下:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5ZOG5ZWm5a2m57yW56iL77yB,size_20,color_FFFFFF,t_70,g_se,x_16第一个参数fd为被写入文件的文件描述符,第二个参数const *buf为写入缓冲区,即写入的内容,第三个参数size_t count为写入文件的大小,常用strlen来判断buf中的大小。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5ZOG5ZWm5a2m57yW56iL77yB,size_20,color_FFFFFF,t_70,g_se,x_16其函数基本用法描述为:将buf内容里面的count个字节写入文件描述符为fd的文件当中 。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5ZOG5ZWm5a2m57yW56iL77yB,size_20,color_FFFFFF,t_70,g_se,x_16

若写入成功,其返回值为写入文件的字节大小,若不成功则返回值为-1。

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include<stdio.h>
#include <unistd.h>
#include<string.h>
int main()
{
        int fd;
        char *buf="file write";
        fd=open("./file1",O_RDWR);
        if(fd==-1){
                printf("open file1 failed\n");
                fd=open("./file1",O_RDWR|O_CREAT,0600);
                if(fd>0){
                        printf("creat file1 successd\n");
                }

        }
        printf("open file1 successed , fd=%d\n",fd);
        //ssize_t write(int fd, const void *buf, size_t count);

        write(fd,buf,strlen(buf));
        close(fd);

        return 0;
}

其中close为关闭文件操作。在该程序运行之后,用户可打开自己所创建的file文件,查看是否将用户定义的buf里面的内容写入进去。

3.读取文件

读取文件的函数为read,其函数原型如下:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5ZOG5ZWm5a2m57yW56iL77yB,size_20,color_FFFFFF,t_70,g_se,x_16第一个参数fd为文件描述符,第二个参数void *buf为读入缓冲区,存放用户读取的数据,第三个参数size_t count为读取数据的大小。 

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5ZOG5ZWm5a2m57yW56iL77yB,size_20,color_FFFFFF,t_70,g_se,x_16

返回值为读取到的字节大小。

该函数用法描述为:在fd指向的文件读取count个字节的数据放到buf里面。

注意:

当我们要将用户刚刚写入的内容读取出来时,要注意光标位置。当写入完成以后,光标会移动到写入的最后一个字符的末尾,而在读取时也会从末尾开始,这样末尾后面为空,读取内容也会为空,解决此问题应在写入完成以后,重新将光标移动到第一个字符前面,用lseek函数。

文件光标移动操作:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5ZOG5ZWm5a2m57yW56iL77yB,size_20,color_FFFFFF,t_70,g_se,x_16

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5ZOG5ZWm5a2m57yW56iL77yB,size_20,color_FFFFFF,t_70,g_se,x_16 第一个参数fd为文件描述符,第二个参数off_t offset 为偏移量,第三个参数int whence为光标固定位置(SEEK_SET文件头,SEEK_END末尾,SEEK_CUR当前)。

该函数作用描述为:将文件读写指针相对whence移动了offset个字节。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5ZOG5ZWm5a2m57yW56iL77yB,size_20,color_FFFFFF,t_70,g_se,x_16该函数的返回值时光标针对文件头的偏移值,如果移动失败,返回值为-1。

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include<stdio.h>
#include<stdlib.h>
#include <unistd.h>
#include<string.h>
int main()
{
        int fd;
        char *buf="this is a txt";
        fd=open("./file1",O_RDWR);
        if(fd==-1){
                printf("open file1 failed\n");
                fd=open("./file1",O_RDWR|O_CREAT,0600);
                if(fd>0){
                        printf("creat file1 successd\n");
                }

        }
        printf("open file1 successed , fd=%d\n",fd);
        //ssize_t write(int fd, const void *buf, size_t count);

        int n_write=write(fd,buf,strlen(buf));
        if(n_write!=-1){
                printf("write %d byte to file\n",n_write);
        }
      
        //off_t lseek(int fd, off_t offset, int whence);

        lseek(fd,0,SEEK_SET);
        char *readBuf;
        readBuf=(char *)malloc(sizeof(char)*n_write+1);
        // ssize_t read(int fd, void *buf, size_t count);
        int n_read=read(fd,readBuf,n_write);
        printf("n_read is :%d,context is :%s\n",n_read,readBuf);

        close(fd);

        return 0;
}

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值