linux编程基础 5.4.2 学习记录

一.open()函数:

打开或创建一个文件,该函数存在于系统函数库fcntl.h中,其声明如下:

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

第一个参数为待打开文件的路径名,第二个参数为文件的访问模式。文件访问模式相关宏定义:

宏定义说明
O_RDONLY以只读方式打开文件
O_WRONLY以只写方式打开文件
O_RDWR以同时读写方式打开文件
O_CREAT创建一个文件并打开,若已存在会出错
O_EXCL测试文件是否存在,不存在则创建文件
O_NOCTTY若pathname为终端设备,则不会将设备分配给对应进程作为控制终端
O_TRUNC以只写或读写方式成功打开文件时,将文件长度截断为0
O_APPEND以追加方式打开文件

其中编号前三个必定任取其一使用,剩余五个宏可有选择地通过管道符号|与前三个宏搭配使用,且只有第二个参数flags = O_CREAT,第三个参数才会被用于设置新文件的权限,取值如下:

mode说明
S_IRWXU文件所有者对文件具有读、写、执行权限
S_IRUSR文件所有者对文件具有权限
S_IWUSR文件所有者对文件具有权限
S_IXUSR文件所有者对文件具有执行权限
S_IRWXG文件所属 组 对文件具有读、写、执行权限
S_IRGRP文件所属 组 对文件具有权限
S_IWGRP文件所属 组 对文件具有权限
S_IXGRP文件所属 组 对文件具有执行权限
S_IRWXO其他人对文件具有读、写、执行权限
S_IROTH其他人对文件具有权限
S_IWOTH其他人对文件具有权限
S_IXOTH其他人对文件具有执行权限

open()函数:调用成功,返回一个文件描述符;不成功,返回-1 

二.read()函数:

从已打开的设备或文件中读取数据,该函数存在于系统函数库unistd.h中,其声明如下:

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

第一个参数为文件描述符,第二个参数为缓冲区,第三个参数为计划读取的字节数。返回值有三种:    正数,请求读取的字节数;    -1,读取文件出错;    0,文件长度有限,若读写位置距文件末尾只有20字节,该函数请求读取30字节,则第一次读取时返回值为20,第二次读取时,返回0。

补充:read函数从设备或网络中读数据,如从终端读取数据,终端写入数据没回车,这些数据不会传给read函数,read函数就会一直阻塞;如从网络端读取数据,网络通信的socket文件没有数据,read函数同样会阻塞。

三.write()函数:

read()相似,向已打开的设备或文件中写入数据,该函数存在于系统函数库unistd.h中,其声明如下:    ssize_t write(int fd, void *buf, size_t count);

第一个参数为文件描述符,第二个参数为缓冲区,第三个参数为最大输出字节数。返回值有两种:调用成功时返回写入的字节数;否则返回-1并设置errno

四.lseek()函数:

每个打开的文件都有一个当前文件偏移量,该值是一个非负整数,表示当前文件的读写位置,linux系统调用lseek()对其进行数值修改,该函数存在于系统函数库unistd.h中,其声明如下:

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

第一个参数为文件描述符;第二个参数用于对文件偏移量的设置,参数可正可负;第三个参数用于控制设置当前文件偏移量的方法,其取值有以下三个:

whence说明
SEEK_SET文件偏移量被设置为offset
SEEK_CUR文件偏移量被设置为当前偏移量+offset
SEEK_END文件偏移量被设置为文件长度+offset

返回值与参数offset相同,成功返回新的偏移量,否则返回-1。

五.close()函数:

用于关闭已打开的文件,该函数存在于系统函数库unistd.h中,其声明如下:

int close(int fd);

调用成功返回0,否则返回-1。

六.案例:

5-2:使用open函数打开或创建一个文件,将文件清空,使用write函数在文件中写入数据,并使用read函数将数据读取并打印。代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
int main(){
    int tempFd = 0;
    char tempFileName[20] = "errorr0.txt";
    //打开一个已存在的errorr0.txt文件
    tempFd = open(tempFileName, O_RDWR|O_EXCL|O_TRUNC, S_IRWXG);//文件所属组,可读、写、执行
    if(tempFd == -1){//判断创建是否成功
        perror("file open error.\n");
        exit(-1);
    }//of if
    //把数据写入到打开的文件中
    int tempLen = 0;
    char tempBuf[100] = {0};
    scanf("%s", tempBuf);
    tempLen = strlen(tempBuf);
    write(tempFd, tempBuf, tempLen);
    close(tempFd);
    //读一遍文件的内容
    tempFd = open(tempFileName, O_RDONLY);
    if(tempFd == -1){
        perror("file open error.\n");
        exit(-1);
    }//of if
    off_t tempFileSize = 0;
    tempFileSize = lseek(tempFd, 0, SEEK_END);
    lseek(tempFd, 0, SEEK_SET);
    while(lseek(tempFd, 0, SEEK_CUR)!= tempFileSize){
        read(tempFd, tempBuf, 1024);
        printf("%s\n", tempBuf);
    }//of while
    close(tempFd);
    return 0;
}//of main

七.学习总结:

首先,不得不说基础知识还是比较好理解,但是,老师对ubantu讲得太少,给了一个PPT就没了,ubuntu跟redhat有些地方有差异,也不提前说,在自己电脑上有点学不走,遇到好多问题,烦躁得很。碰到一大堆问题,不想学了,后面再来吧,先复习最近的考试。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值