当前位置: 首页 > 工具软件 > open-c-book > 使用案例 >

Linux系统编程之open,write

刘瀚
2023-12-01

1.API函数之open函数

int open(const char *pathname,int flags);
int open(const char *pathname,int flags,mode_t mode);

open函数返回的是一个文件描述符,打印出来的值为非负整数。(文件描述符类似于索引)

pathname:要打开的文件名。

flags:打开方式有:O_RDONLY(只读打开),O_WRONLY(只写打开),O_RDWR(可读可写打开)。

以上参数只能指定一个,下列参数是可选择的:

        O_CREAT 若文件不存在则创建它。使用此选项时,需要同时说明第三个参数mode,用其说明该新文件的存取许可权限。

        O_EXCL 如果同时指定了OCREAT,而文件已经存在,则出错。       

        O_APPEND 每次写时都加到文件的尾端。

        O_TRUNC 属性去打开文件时,如果这个文件中本来是有内容的,而且为只读或只写成功打开,则将其长度截短为0。

mode:一定是在flags使用了O_CREAT标志,mode记录待创建的文件的访问权限。

使用该函数需要包含头文件

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

先来看代码

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

如果file1存在的话,返回的是一个非负整数,如果file1不在的话就返回一个负数,经过测试该负数的值为-1。

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("create file1\n");
                }
        }
        return 0;
}

如果file1不存在的话,可以用第二个open函数来创建文件,需加上|0_CREAT,0600指的是可读可写。


int main()
{
        int fd;
        char *buf="Hello World";
        fd=open("./file1",O_RDWR|O_CREAT|O_EXCL,0600);

        printf("%d",fd);
        close(fd);
        return 0;
}

如果文件存在值输出-1,这是因为加了O_CREAT|O_EXCL

int main()
{
        int fd;
        char *buf="Hello World";
        fd=open("./file1",O_RDWR|O_APPEND,0600);
        printf("open sucess:fd=%d\n",fd);

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

        close(fd);
        return 0;
}

使用O_APPEND,如果原文件有内容,则在下一行写入内容。

int main()
{
        int fd;
        char *buf="Hello Worldi1";
        fd=open("./file1",O_RDWR|O_TRUNC,0600);
        printf("open sucess:fd=%d\n",fd);

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

        close(fd);
        return 0;
}

使用O_TRUNC,如果原文件有内容,则会先清空内容,再写入内容。
2.API函数之write

ssize_t write(int fd,const void *buf,size_t count);

成功是话write返回的是写入的个数。

字符串buf读取count个字节存放在fd文件描述符中指向的文件里。

使用该函数需包含文件

#include <unistd.h>

#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="Hello World";
        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("create file1\n");
                }
        }
        printf("open sucess:fd=%d\n",fd);
        write(fd,buf,strlen(buf));


        close(fd);
        return 0;
}

计算长度用strlen,sizeof计算的是but的大小,strlen计算的是buf内容的有效长度。

close(fd):关闭文件。
 

 类似资料: