基于系统调用的文件类编程

文件描述符:
在Linux系统中,所有打开的文件也对应一个数字,这个数字由系统来分配,我们称之为:文件描述符。文件描述符的名字通常定义为fd。数据类型为int

打开文件:

函数原形:
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);

函数功能:
打开或创建一个文件。

所属头文件:

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

返回值:
打开文件成功,返回文件描述符;打开失败,返回-1。

参数说明:
pathname:指明要打开文件的文件名,含有文件名的路径字符串

flags:文件打开的标志,有三种flag 必须要包含一个O_RDONLY,O_WRONLY,O_RDWR,其他的可以选择,多个参数使用位或(|)符号,其中有两个常用:
O_APPEND:以追加方式打开文件,写入的数据跟在已有数据之后。
O_CREAT:打开的文件不存在时,可以创建所需的文件。

mode:仅在flags中使用了O_CREAT标志时一定要使用, mode记录了打开文件的权限。例如:0742,7代表了创建者的权限,4代表了用户的权限,2代表了其他人的权限。

创建文件

函数原形:
int creat(const char *pathname, mode_t mode);

函数功能:
创建文件,并以只写的方式打开该文件。

所属头文件:

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

返回值:
打开文件成功,返回文件描述符;打开失败,返回-1。

参数说明:
pathname:指明要打开文件的文件名,含有文件名的路径字符串
modes:创建文件的读写权限。creat函数相当于使用了参数O_CREAT | O_WRONLY |O_TRUNC的open函数。使用了creat就必须使用modes。

关闭文件

函数原形:
int close(int fd)

函数功能:
关闭一个打开的文件

所属头文件:

#include <unistd.h>

返回值:
关闭成功返回0,关闭失败返回-1.

参数说明:
fd:待关闭的文件的文件描述符。

读文件

函数原形:
ssize_t read(int fd, void *buf, size_t count);

函数功能:
从指定的文件描述符对应的文件中读取数据。

所属头文件:

#include <unistd.h>

返回值:
读取成功,返回读取的字节数。读取失败,返回-1.

参数说明:
fd:要读取的文件的描述符。
count:最多读取的字节数,希望读取的字节数。
buf:读取来的数据存储位置的首地址,buf指向读取来的数据。

写文件

函数原形:
ssize_t write(int fd, const void *buf, size_t count);

函数功能:
向一个打开的文件写入数据。

所属头文件:

#include <unistd.h>

返回值:
若写入成功,返回写入的数据的字节数。若失败,返回-1

参数说明:
fd:要写入的文件的描述符。
count:最多写入的字节数,希望写入的字节数。
buf:写入的数据存储位置的首地址,buf指向要写入的数据。

定位文件

函数原形:
off_t lseek(int fd, off_t offset, int whence);

函数功能:
重新定位所打开的文件的文件读写指针的位置。打开一个文件时,除非设置O_APPEND属性,否则指针指向文件开始位置。

所属头文件:

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

返回值:
若操作成功,则返回现在的读写指针位置,以距离文件开始处的字节数来表示。若操作失败,返回-1.

参数说明:
fd:打开文件的描述符。
offset:所需要的读写指针的位置偏移,若为正数则向后移,若为负数则向前移。
whence:以下三种选一种:
SEEK_SET:将指针位置设置为offset的位置。
SEEK_CUR:将指针位置设置为当前位置加上offset的位置。
SEEK_END:将指针位置设置为文件结尾加上offset的位置。
举例:lseek(fd, 0, SEEK_SET);//设置到开头位置

复制文件描述符

函数原形:
int dup(int oldfd);

函数功能:
复制一个文件描述符,返回当前可用文件描述符中的最小数值。

所属头文件:

#include <unistd.h>

返回值:
成功返回新的文件描述符,失败则返回-1.

参数说明:
oldfd:被复制的老的文件描述符。

例程:

例程1:复制文件

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

void main(int argc, char **argv)
//main的参数意义:像cp函数一样,运行时第一个参数为源文件,第二个为目标文件。
{
    int fd_s, fd_d;
    int count = 0;
    char buf[512];

    /* 打开源文件 */
    fd_s = open(argv[1], O_RDONLY);

    /* 打开目标文件 */
    fd_d = open(argv[2], O_RDWR | O_CREAT, 0755);

    /* 读取源文件数据,并将源文件中的数据写到目标文件中 */
    while((count = read(fd_s, buf, 512)) > 0)
        if (count < 512)
            write(fd_d, buf, count);
        else
            write(fd_d, buf, 512);

    /* 关闭源文件和目标文件 */
    close(fd_s);
    close(fd_d);
}

例程2:各个函数的用法

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

void main()
{
    //打开文件
    int fd;
    int fd_new;
    int close_result;
    char buf_write[10] = "1234567890";
    char buf_read[10];

    fd = open("./test.c", O_RDWR | O_CREAT, 0755);  
    if (fd < 0)
        printf("open fail.\n");
    else
        printf("the descriptor is %d, open successfully.\n", fd);
/*
    //关闭文件
    close_result = close(fd);
    if (close_result < 0)
        printf("close fail.\n");
    else
        printf("close successfully\n");
*/

    //写入文件
    write(fd,buf_write, 10);
    printf("write over.\n");    

    //定位文件中读写指针的位置
    lseek(fd, 0, SEEK_SET); 

    //复制文件描述符
    fd_new = dup(fd);

    //读取文件
    read(fd_new, buf_read, 5);
    buf_read[5] = '\0';
    printf("buffer is %s.\n", buf_read);

    close(fd);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值