Linux文件I/O编程(一)

目录

打开文件(open)

创建文件(creat)

文件写入(write)

文件读取(read)

文件光标移动(lseek)

access判断文件是否存在

文件操作原理


打开文件(open)

作用:进程中打开一个文件返回一个文件描述符供后续read、write使用。

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

参数:

pathname:要打开的文件名(含路径,缺省为当前路径)

flags:O_RDONLY 只读打开    O_WRONLY  只写打开    O_RDWR 可读可写打开。

参数 flags 是通过 O_RDONLY, O_WRONLY 或 O_RDWR与零或多个可选模式按位或操作得到的。如,O_RDWR|O_CREAT。

mode:  如果指定了O_CREAT,即创建文件需要说明文件的权限,如0600。

可读 r--4,可写 w--2,可执行 x--1。上面代码中的“0600”中第3位是文件所有者的权限,6等于可读+可写 =4+2=6,第2位是同组用户,第1位是其他用户。

返回值:1.返回一个文件描述符,后面对文件进行读取,写入等操作需要文件描述符。

               2.若文件打开失败,返回值 -1,并设置errno以指示错误。


创建文件(creat)

int creat(const char *pathname, mode_t mode);

filename:要创建的文件名(包含路径,缺省则为当前路径)

mode:权限

返回值: 文件描述符(fd)

常见创建模式:

宏表示               值 

S_IRUSR       00400        文件所有者可读

S_IWUSR      00200        文件所有者可写

S_IXUSR       00100        文件所有者可执行

S_IRWXU      00700        文件所有者可读、写、执行


文件写入(write)

作用:将*buf指向的缓冲区的字节写入描述符指向的文件。

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

参数:

fd:被写入文件的文件描述符,       *buf:缓冲区,即字符串         count:写入文件的字节数。

返回值:如果成功写入,返回写入的字节数。出错时,返回值 -1,并设置errno以指示错误;

demo:

#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 = "helloworld";
        fd = open("./file1",O_RDWR|O_CREAT,0600);/*或O_CREAT,若文件不存在,创建文件并赋予权限  */
        if(fd==-1){
                perror("perror:");
        }else{
                printf("open file\n");
                printf("fd = %d\n",fd);
        }
        int n_write = write(fd,buf,strlen(buf));//文件写入
        close(fd);//关闭文件
        return 0;
}

写入操作时注意使用strlen计算写入的字节数,避免把‘\0'字符写入文件。


文件读取(read)

作用:从"fd"指向的文件读取"count"个字节的数据,写入"buf"。

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

参数:

fd:被读取文件的文件描述符      *buf:读取到程序中的字符串        count:读取的字节数。

返回值:成功时,返回读取的字节数。出错时,返回值 -1,并设置errno以指示错误。


文件光标移动(lseek)

移动文件的光标。

off_t lseek(int fd, off_t offset, int whence);

参数:

fd: 文件描述符      offset:相对whence偏移值,负数向前偏移,正数向后偏移       

whence:选择光标位置 , SEEK_SET :文件头

                                            SEEK_CUR:当前位置

                                            SEEK_END:文件尾

返回值:成功时,返回从文件头到光标的字节数,可用于计算文件大小,lseek(fd,0,SEEK_END)。出错时,返回值 -1,并设置errno以指示错误。

int fileSize = lseek(fd,0,SEEK_END);//计算文件大小

demo:

        


#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 = "helloworld";
        fd = open("./file1",O_RDWR|O_CREAT,0600);/*或O_CREAT,若文件不存在,创建文件并赋予权限  */
        if(fd==-1){
                perror("perror:");
        }else{
                printf("open file\n");
                printf("fd = %d\n",fd);
        }
        int n_write = write(fd,buf,strlen(buf));//文件写入

int n_write = write(fd,buf,strlen(buf)); //将buf中一定的字节数写到fd,返回写入的字节数
        if(n_write!=-1){
                printf("write %d bytes to file\n",n_write);
        }

        char *bufRead;
        bufRead = (char *)malloc(sizeof(char)*n_write);
        lseek(fd,0,SEEK_SET);//文件写入后光标在末尾,现移到头部
        int n_read = read(fd,bufRead,n_write);//将fd中一定的字节数数据读到bufRead
        printf("read %d bytes, 内容为: %s\n",n_read,bufRead);
        close(fd);//关闭文件
        return 0;
}

access判断文件是否存在

判断文件是否具有读,写,可执行或者是否存在

int access(const char *pathname, int mode);

参数:

pathname:文件名        

mode:可以选择以下宏:                                                                                                         

F_OK 文件是否存在
R_OK 文件否具有读权限
X_OK 文件否具有可执行权限
W_OK 文件否具有写权限

返回值:

满足mode中的参数并且正确执行则返回0 ,否则返回-1。


文件操作原理

  • 文件描述符

fd: 文件描述符,是程序对磁盘中某个文件操作后返回给程序空间的一个索引(非负整数),后续对该文件操作都需要索引。

Linux默认的文件描述符:0、1、2

标准输入和输出

 UNIX shell 使用文件描述符0与进程的标准输入相结合,1与标准输出相结合,2与标准错误相结合。STDIN_FILENO、STDOUT_FILENO、STDERR_FILENO、这几个宏分别代替0、1、2。

char readbuff[64] = "\0";
int n_read = read(0,readbuff,8);//从标准输入读取,即读取键盘的输入
int n_write = write(1,readbuff,n_read);//往标准输出写入,即在终端输出。

标准错误:将错误信息放到标准错误中。

  • 文件描述符的作用域是只是当前进程。

文件操作步骤:打开/创建文件——>读取/写入文件——>关闭文件

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值