linux系统文件编程基本概述

文件编程概述

以下是操作系统提供的一系列API:

打开         open

读写         write/read

光标定位         lseek

关闭         close

打开创建文件(open)

函数原型以及需要包含的头文件

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
//需要包含的头文件
       int open(const char *pathname, int flags);//pathname:指代路径,const:常量,const char * :字符串常量指针;flags:是文件创建标志
       int open(const char *pathname, int flags, mode_t mode);//mode:是权限,
        int creat(const char *pathname, mode_t mode);
flags:
    必须有一个的权限:
    O_RDONLY  只读打开      O_WRONLY  只写打开         O_RDWR  可读可写打开
    下列常数是可选择的:
    O_CREAT     //文件不存在则创建它
    O_EXCL      //如果同时指定了O_CREAT,而文件已经存在,则打开文件失败,(用于判断文件是否存在)
    O_APPEND    //每次写时都将内容从文件尾端换行后开始写起
    O_TRUNC     //直接将之前的内容全部清除,新写入执行的内容

调用open后,open会返回一个int类型的文件描述符

每个进程打开一个文件都会建立一个结构体来管理这个文件,而文件的描述符会指向内核里的结构体,起到索引的作用

open实现

        int fd;
        fd=open("./file1",O_RDWR);
​
        printf("fd = %d\n",fd);//打印返回的文件描述符,如果存在file1,返回值大于0,如果不存在。或者打开文件失败返回一个负数
        if(fd < 0){
                fd=open("./file1",O_RDWR | O_CREAT,0600);//如果打开失败,再次打开并创建我文件file1,0600是可读可写权限
        }

文件权限描述:

ls -l 命令后再最前面会出现 -rwxrwxr-x 的一串字符,这串字符就是文件权限

-rwxrwxr-x :最前面有一个横杠,表示是普通文件,前两个字母 rw 表示可读可写的权限,第三个字母 x 是执行权限

可读 r 4

可写 w 2

执行 x 1

mode = 0600 表示可读可写的权限( 6 = 4 + 2 )

第三位 0 :表示同组

第四位 0:表示其他组

写入文件(write)

#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);//fd:文件描述符     buf:文件缓存区       count:文件长度,字节
//成功返回写入字节数,错误返回-1,用error可打出错误信息

实现代码:

char *buf="gan guo dong shuai";//先定义文件缓冲区buf
​
write(fd,buf,strlen(buf));//写入相对于字节的数据进行fd所指的文件
close(fd);//最后记得关闭文件,不然容易将文件损坏

读文件(read)

函数及其原型

#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);//fd:文件描述符    buf:读取内容放置区,  count:读取长度

代码

close(fd);
fd=open("./file1",O_RDWR);//这里重新关闭打开文件,原因是之前在写入文件时文件的光标已经移动到文件尾部,可以用sleek移动光标,也可以重新打开文件,重新打开文件光标就在文件头
readbuf=(char *)malloc(sizeof(char)*n_write+1);//这里需要位readbuf开辟空间
int n_read=read(fd,readbuf,n_write);//读取内容,read和write都是返回的int类型
​
printf("read: %d contect: %s\n",n_read,readbuf);//输出结果

光标移动操作(lseek)

原函数

#include <sys/types.h>
#include <unistd.h>
​
off_t lseek(int fd, off_t offset, int whence);//fd:文件描述符,   offset:相对于whence偏移量     whence:位置
whence:
    SEEK_SET//指向文件头部
​
    SEEK_CUR//指向文件当前位置
​
    SEEK_END//指向文件尾部
​

现在我们可以把之前重新打开文件的操作换为光标移动

lseek(fd,-n_write,SEEK_CUR);
lseek(fd,0,SEEK_SET);
lseek(fd,-n_write,SEEK_END);//这三种方式都能将光标移动到文件头部

我们还可以用光标计算文件长度,lseek返回值是字节形式的offset;可以用下面方式计算文件长度

int a;
a=lseek(fd,0,SEEK_END);

close就是关闭文件,这个前面有,就不再做说明。

整体实现代码如下:

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

int main()
{
        int fd;
        char *buf="gan guo dong shuai";
        char *readbuf;

        fd=open("./file1",O_RDWR);

        printf("fd = %d\n",fd);
        if(fd < 0){
                fd=open("./file1",O_RDWR | O_CREAT,0600);
                printf("fd = %d\n",fd);
        }

        //ssize_t write(int fd, const void *buf, size_t count);
        int n_write=write(fd,buf,strlen(buf));
        lseek(fd,-n_write,SEEK_CUR);

        readbuf=(char *)malloc(sizeof(char)*n_write+1);
        int n_read=read(fd,readbuf,n_write);

        printf("read: %d contect: %s\n",n_read,readbuf);
        close(fd);

        return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值