系统级程序设计(第一课)

目录

基本流程

1 文件I/O

1.1open函数

1.2read&write函数

1.3lseek函数

1.4close函数

案例

运行截图

总结


基本流程

  1. 创建/打开一个文档
  2. 对文档进行编辑
  3. 保存文档
  4. 关闭文档

1 文件I/O

open()

read()

write()

lseek()

close()

1.1open函数

#include <fcntl.h>
int open(const char *pathname, int flags[, mode_t mode);

open函数参数说明:

  • pathname:待打开文件的文件路径名;
  • flags:访问模式,常用的宏有:
    – O_RDONLY:只读
    – O_WRONLY: 只写
    – O_RDWR: 读写
    – O_CREAT: 创建一个文件并打开
    – O_EXCL: 测试文件是否存在,不存在则创建
    – O_TRUNC: 以只写或读写方式成功打开文件时,将文件长度截断为0
    – O_APPEND: 以追加方式打开文件

只有第二个参数flags = O_CREAT,第三个参数才会被用于设置新文件的权限,取值如下:

  • S_IRWXU: 文件所有者,读、写、执行
  • S_IRUSR: 文件所有者,读
  • S_IWUSR: 文件所有者,写
  • S_IXUSR: 文件所有者,执行
  • S_IRWXG: 文件所属组,读、写、执行
  • S_IRGRP: 文件所属组,读
  • S_IWGRP: 文件所属组,写
  • S_IXGRP: 文件所属组,执行
  • S_IRWXO: 其他人,读、写、执行
  • S_IROTH: 其他人,读
  • S_IWOTH: 其他人,写
  • S_IXOTH: 其他人,执行

返回值说明:

  • 调用成功,返回一个文件描述符
  • 不成功,返回-1

1.2read&write函数

  • #include <unistd.h>
    ssize_t read(int fd, void *buf, size_t count);
  • read函数参数说明:

  • fd: 从open或create函数返回的文件描述符
  • buf: 缓冲区
  • count: 读取数据的字节数
  • ssize_t: 有符号的size_t,有三种返回值
    – 正数:请求读取的字节数
    – 0: 文件长度有限,若读写位置距文件末尾只有20字节,该函数请求读取30字节,则第一次读取时返回值为20,第二次读取时,返回0
    – -1: 读取文件出错
  • write函数参数说明:
  • 返回值说明: 返回写入的字节数或者-1并设置errno
  • 特殊说明: 向终端或网络端写数据时,可能会进入阻塞状态

1.3lseek函数

#include <unistd.h>
ssize_t write(int fd, off_t offset, int whence);

lseek函数参数说明:

  • fd: 从open或create函数返回的文件描述符
  • offset: 对文件偏移量的设置,参数可正可负
  • whence: 控制设置当前文件偏移量的方法
    – whence = SEEK_SET: 文件偏移量被设置为offset
    – whence = SEEK_CUR: 文件偏移量被设置为当前偏移量+offset
    – whence = SEEK_END: 文件偏移量被设置为文件长度+offset

返回值说明:

  • 设置成功:返回新的偏移量
  • 不成功:-1

1.4close函数

#include <unistd.h>
int close(int fd);

返回值说明:

  • 成功:返回0
  • 不成功:-1

案例

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>

int main()
{
    int tempFd = 0;
    char tempFileName[20]= "csc8.txt";
    
    //1.creat a file
    tempFd = open(tempFileName, O_RDWR| O_TRUNC |O_EXCL, S_IRWXU| S_IRWXG);
    
    //check the file exsist
    if(tempFd == -1){
        perror("file open error.\n");
        exit(-1);
    }
    
    //2. write data
    int tempLen = 0;
    char tempBuf[100] = {0};
    scanf("%s", tempBuf);
    tempLen = strlen(tempBuf);
    write(tempFd, tempBuf, tempLen);
    close(tempFd);
    
    
    //3.read the file
    tempFd = open(tempFileName , O_RDONLY);
    if(tempFd == -1){
        perror("file read error.\n");
        exit(-1);
    }
    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);
    }
    
    //4.close
    close(tempFd);
    return 0;

}

运行截图

总结

这是我第一次用csdn写上课学到的东西和自己的感想,这是一些总结:

①规范化变量名命名,对一些临时的变量会使代码可读性增强。

②学习c语言时,我习惯将花括号打成独立的两行,现在老师要求代码要规范,并且让我们自己体会这样的好处,大括号贴紧函数以及多用注释,大括号贴紧函数显得代码紧凑,多用注释可使得代码更易读懂,比如if、while等等在最后打个注释//of if可以让我们一眼就看出这个条件分支或者循环从哪开始到哪结束,可读性更强。

③文件函数对让我对第一节课所学的知识加深了一些印象,对其了解了许多。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值