基础IO(文件读取写入,重定向,缓冲区)

1.文件基本理论

1.文件=文件内容和文件属性,文件属性也是数据,即使你创建一个新文件也要占据磁盘空间
2.文件操作=文件内容的操作+文件属性的操作,有可能,在操作文件的过程中,即改变内容,又改变属性,就是你更改了内容,那么你的文件大小也会发生改变
3.所谓的打开文件,到底在干什么?将文件的属性或内容加载到内存中!因为cpu要执行fread和fwrite,根据冯诺依曼体系cpu只能从内存做读写
4.是不是所有的文件,都会处于被打开的状态?肯定不是!那么没被打开的文件,在哪里?他只在磁盘上静静的存贮着!当要用的时候再打开
5要是打开的话打开的文件(内存文件)和磁盘文件都各有一份
6.通常我们打开文件,访问文件,是谁在进行相关操作?fopen,flose,fread,fwrite等等这些接口来打开读写等文件,但是我们写代码调用接口,它有在对文件进行操作吗?答案是没有的是把我的代码编译起可执行文件,在运行变成程序,才会执行对应的代码,这样才是真正对我呢见进行相关操作。那么对文件进行操作时的进程!!!
7.那么我们学习文件操作,就是学习进程和打开文件的关系
8.当我们向文件写入的时候,最终是向磁盘写入的,磁盘是硬件,那么只有谁有资格向硬件写入,只有操作系统,那么如果我们想绕开操作系统来操作硬件可以吗?答案是不能,所有上层访问文件的操作,都必须要经过操作系统·,那么操作系统是如果被上层调用的,我们必须使用操作系统他提供的系统接口,如果那个语言他是具有跨平台性的,那么他就会封装所有系统接口(这个叫做上层接口),我们可以通过语言封装的上层接口来间接通过操作系统来访问硬件这也就是跨平台性
9.那么我们为什么要封装?
1.原生系统接口,使用成本比较高
2.语言不具备跨平台性

2.什么是当前路径

我们理解的是当前路径就是我们执行代码所在的路径,那么这个是否正确?

#include<stdio.h>
#include<unistd.h>

int main()
{
   
  FILE* fp = fopen("log.txt","w");
  if(fp == NULL)
  {
   
    perror("fopen");
    return 1;
  }

  printf("mypid:%d\n",getpid());

  while(1)
  {
   
    sleep(1);
  }
  const char*msg = "hello !!!";
  int cnt = 1;
  

  while(cnt < 20)
  {
   
    fprintf(fp,"%s; %d\n",msg,cnt++);
  }

  fclose(fp);
  
  return 0;
}

上面代码是先不写入文件,先打印pid
在这里插入图片描述
我们先看卷起来的红框,这个是查看进程,下面图片里面有个cwd,这个就是工作路径

在这里插入图片描述
那么我们可以理解到当前路径其实是进程所在的路径,那么要是我们把这个工作路径改了呢?那么当前路径,还是不是我们以前理解的一样就是当前执行文件所在的路径

我们在代码加上

 chdir("/home/lxz");//更当当前进程的工作路径    

用来更改工作路径

我们把自己写的日志给删了,就是上面的log.txt,那么我们看到现象会是cwd的路径改了改成/home/lxz,并且log.txt的这个文件会在/home/lxz这个路径里

在这里插入图片描述

在这里插入图片描述

3.open接口

open第一个参数pathname,要打开的文件名(要路径的),第二个参数flags代表的是你要选择的选项,第三个参数mode代表的是你要创建文件的初始权限,它的返回值,可以看到不是和C语言一样的FILE*而是int,他代表的是打开一个文件,一个文件描述符,-1代表打开错误
在这里插入图片描述
我们先来用用看,在用之前我们先来了接一下别的系统接口
O_RDONLY, O_WRONLY, O_RDWR,O_APPEND,O_CREAT

.O_RDONLY: 以只读的方式打开
O_WRONLY: 以只写的方式打开
O_RDWR : 以读写的方式打开
O_APPEND: 以追加的方式打开
O_CREAT: 创建并打开一个新文件

上面五个接口,看到大写用_来区分的,有这种标志的我们一眼就知道了,这些都是宏,这些就是上面flags这个选项的,如果我们用来做标记位的话,c语言是用整型来做标记位的,但是如果有很多呢?20,30个?这里当然也可以用可变参数列表,但是不方便,这个时候就要用到位图了,大家都知道int是有32个比特位的,那么我们就可以用一个比特位来代表读或者写或者读写等等

1.写入文件内容

下面代码就是打开一个文件log.txt,给给予这个文件权限0666,并写入一些内容到log.txt里面,而至于O_WRONLY: 以只写的方式打开,O_CREAT: 创建并打开一个新文件,umask(0)就是初始化umask码了,因为相比于操作系统默认的umask权限,我们自己初始化的时候,不用进行计算,毕竟umask全都是0,这样文件权限给错失误率会降低, 这个代码也要注意下write(fd,str,strlen(str));这个是不能加1的,因为文件是不识别你的\n的,如果你还是要加1的话,写入文件的话,会生成一些特殊字符

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


int main()
{
   
  umask(0);//初始化umask码
  int fd = open("log.txt",O_WRONLY | O_CREAT,0666);
  if(fd < 0)
  {
   
    perror("open");
    return 1;
  }

  printf("fd: %d\n",fd);
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值