linux基础IO【万字详解,看不懂算我输】

一、重新谈论文件

  1. 空文件也要在磁盘占据空间
  2. 文件 = 内容 + 属性
  3. 文件操作 = 对内容 + 对属性 or 对内容和属性
  4. 标定一个问题,必须使用:文件路径 + 文件名【唯一性】
  5. 如果没有指明对应的文件路径,默认是在当前路径进行文件访问
  6. 当我们把fopen, fclose, fread, fwrite等接口写完之后,代码编译之后,形成二进制可执行程序之后,但是没运行,文件对应的操作有没有被执行呢?没有 — 对文件的操作,本质是进程对文件的操作!
  7. 一个文件如果没有被打开,可以直接进行文件访问吗?不能!一个文件要被访问,就必须先被打开!— 用户进程 + os

所以,文件操作的本质就是进程和被打开文件的关系。

二、重新谈论文件操作 C

  1. 文件在哪里-》磁盘-》硬件-》os-》所欲哦人想要访问文件不能绕过os-》使用os提供的接口-》提供文件级别的系统调用接口-》可以,操作系统只有一个
  2. 操作 C语言
    示例代码:
  1 #include<stdio.h>
  2 #include<unistd.h>
  3 #include<string.h>
  4 #define FILE_NAME "log.txt"
  5 
  6 int main()
  7 {
   
  8     //以w方式单纯的打开文件,c会自动清空内部的数据
  9     FILE* fp = fopen(FILE_NAME, "a");//r,w,r+(读写,不存在出错),w+(读写,不存在创建),a(apend, 追加),a+(读+追加)               
 10     if(fp == NULL)      
 11     {
                      
 12         perror("fopen");
 13         return 1;       
 14     }                   
 15     //char buffer[64];
 16     把文件中的数据读取到buffer中                                    
 16     //while(fgets(buffer, sizeof(buffer) - 1, fp) != NULL)
 17     //{                                  
 18     //    buffer[strlen(buffer) - 1] = 0;
 19     //    puts(buffer); 
 20     //}                 
 21                         
 22     int cnt = 5;        
 23     while(cnt)          
 24     {
                                                   
 25         fprintf(fp, "%s:%d\n", "hello world", cnt--);
 26     }                   
 27                         
 28     fclose(fp);         
 29     return 0;           
 30 }

如上,是我们之前学的文件相关操作。还有 fseek ftell rewind 的函数,在C部分已经有所涉猎。

三、系统文件I/O

操作文件,除了上述C接口(当然,C++也有接口,其他语言也有),我们还可以采用系统接口来进行文件访问,先来直接以代码的形式。
示例代码:

  1 #include<stdio.h>
  2 #include<unistd.h>
  3 #include<string.h>
  4 #include<sys/types.h>
  5 #include<sys/stat.h>
  6 #include<fcntl.h>
  7 #define FILE_NAME "log.txt"
  8 
  9 int main()
 10 {
   
 11     umask(0); 
 12     //"w" --> O_WRONLY | O_CREAT | O_TRUNC, 0666
 13     //"a" --> O_WRONLY | O_CREAT | O_APPEND, 0666
 14    int fd = open(FILE_NAME, O_RDONLY, 0666);
 15    if(fd < 0)
 16    {
   
 17        perror("open");
 18        return 1;
 19    }
 20    char buffer[1024];
 21    ssize_t num = read(fd, buffer, sizeof(buffer) - 1);
 22    if(num > 0)
 23    {
   
 24        buffer[num] = 0;
 25    }
 26    printf("%s", buffer);
 27    //int cnt = 5;
 28    //char outBuffer[64];
 29    //while(cnt)                                                                                    
 30    //{
   
 31    //    sprintf(outBuffer, "%s:%d\n", "aaaaa", cnt--);
 32    //    //你以\0作为字符串的结尾,是C语言的规定,和我文件有什么关系呢?
 33    //    write(fd, outBuffer, strlen(outBuffer));
 34    //}
 35    //printf("fd:%d\n", fd);
 36 
 37    close(fd);
 38 
 39     return 0;
 40 }

3.1 接口介绍

  • open man open
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    int open(const char *pathname, int flags);
    int open(const char *pathname, int flags, mode_t mode);
    pathname: 要打开或创建的目标文件
    flags: 打开文件时,可以传入多个参数选项,用下面的一个或者多个常量进行“或”运算,构成flags。
    参数:
    O_RDONLY: 只读打开
    O_WRONLY: 只写打开
    O_RDWR : 读,写打开
    这三个常量,必须指定一个且只能指定一个
    O_CREAT : 若文件不存在,则创建它。需要使用mode选项,来指明新文件的访问权限
    O_APPEND: 追加写
    返回值:
    成功:新打开的文件描述符
    失败:-1
    write read close lseek ,类比C文件相关接口

3.2 如何理解文件

在这里插入图片描述
示例代码:

  1 #include<stdio.h>
  2 #include<unistd.h>
  3 #include<string.h>
  4 #include<sys/types.h>
  5 #include<sys/stat.h>
  6 #include<fcntl.h>
  7 #define FILE_NAME(number) "log.txt"#number
  8 
  9 int main()
 10 {
   
 11     printf("stdin->fd:%d\n", stdin->_fileno);
 12     printf("stdout->fd:%d\n", stdout->_fileno);
 13     printf("stderr->fd:%d\n", stderr->_fileno);
 14     umask(0
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值