(四)LINUX文件编程(系统调用方式)

本文详细介绍了Linux系统中文件操作的基本概念及常用函数,包括文件描述符的概念、如何使用open、close、read、write等函数进行文件操作,以及文件定位和复制的具体实现。

 1.核心理论 -文件描述符

在中国,每一个成年的公民都会有一个身份证编号,它的本质就 是一个数字,我们可以利用这个数字来标记这个公民。在Linux系 统中,所有打开的文件也对应一个数字,这个数字由系统来分配, 我们称之为:文件描述符

 

2.函数学习-文件操作

打开文件

函数名 :   open()函数

函数原形:

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

函数功能:   

用于打开或者创建一个文件

所属头文件:     

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

 

返回值:           

Success:文件描述符                    Fail: -1

 

参数说明:    

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

Flags:文件打开的标志:
O_APPEND:以追加方式打开文件
O_CREAT:当文件不存在,创建一个新文件
o_RDONLY:只读方式打开
O_WRONLY:只写方式打开
O_RDWR:读写方式打开
O_NOBLOCK:非阻塞方式打开。

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

 

创建文件

 函数名:  creat()

 函数原形

int creat(const char *filename,mode_t mode)

 函数功能

创建文件

 所属头文件

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

 返回值

Success:文件描述符            Fail: -1

 参数说明

filename:要创建的文件名(包含路径、缺省为当前路径)
mode:    创建模式   //可读可写可执行




常见创建模式:

宏表示     数字
S_IRUSR    4   可读
S_IWUSR    2   可写
S_IXUSR    1   可执行
S_IRWXU    7   可读、写、执行

 

关闭文件

 函数名 close()

 函数原形

Int close(int fd)    //关闭一个打开的文件

 函数功能

关闭一个打开的文件

 所属头文件

<unistd.h>

 返回值

Success:0 fail:-1

 参数说明

Fd:待关闭的文件描述符  //从系统open调用返回来的

 

读文件

 函数名: read()

 函数原形

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

 函数功能

从一个打开的文件中读取数据

 所属头文件

<unistd.h>

 返回值

cnt:返回读取的字节数   fail:-1

 参数说明

Fd:    要读取数据的文件的描述符
Count:希望读取的字节数
Buf:  读取来的数据存到buf指向的空间

 

写文件

 函数名 write()

 函数原形

size_t write(int fd,void *buf,size_t count)

 函数功能

写入到文件

 所属头文件

<unistd.h>

 返回值

返回写入到文件的字节数。 Fail:-1

 参数说明

Fd:   要写入数据的文件的描述符
Buf:  要写入的数据存放位置
Count:希望写入的字节数

 

文件定位

 函数名 lseek()

 函数原形

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

 函数功能

将文件读写指针相对whence移动offset个字节。

 所属头文件

<sys/types.h>  <unistd.h>

 返回值

Success: 返回移动后的文件指针距离文件头的位置  Fail:-1

 参数说明

Fd:    需要重新定位的文件的描述符
Offset:在其实位置基础上设置的偏移量(向前移动时是负值、向后移动是正值)
Whence:设置文件偏移指针开始移动的位置
        SEEK_SET:开始偏移的起始位置为文件头
        SEEK_CUR:开始偏移的起始位置为目前的位置
        SEEK_END:开始偏移的起始位置为文件尾//计算文件长度

 

复制文件描述符

 函数名 dup

 函数原形

Int dup(int oldfd);
Int dup2(int oldfd,int newfd);

 函数功能

复制一个文件描述符

 所属头文件

<unistd.h>

 返回值

Success:返回新的文件描述符  fail:-1

 参数说明

oldfd: 待复制的老的文件描述符

 

 

 

文件复制程序

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

int main(int argc, char *argv[])
{
    int fd1, fd2;
    int count, count2;
    char buffer[1024] = {0};
    char *ptr;

    if (argc != 3)
    {
        printf("Usage: %s file1 file2\n", argv[0]);
        return 1;
    }

    if (-1 == (fd1 = open(argv[1], O_RDONLY)))
    {
        perror("open file1\n");
        close(fd1);
        return 2;
    }

    if (-1 == (fd2 = open(argv[2], O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR)))
    {
        perror("open file2\n");
        close(fd2);
        return 3;
    }

    while (count = read(fd1, buffer, 1024))
    {
        if (-1 == count)
        {
            perror("read");
            return 4;
        }
        ptr = buffer;
        int count2 = write(fd2, ptr, count);
        if (-1 == count2)
        {
            perror("write\n");
            return 5;
        }
        memset(buffer, 0, 1024);
    }
    close(fd1);
    close(fd2);

    return 0;
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值