【lesson32】基础IO之复习C语言的接口

文章目录

  • 基础IO要讲的知识点介绍
  • 复习C语言的接口

基础IO要讲的知识点介绍

1.复习一下C语言的接口
2.直接使用系统接口
3.分析系统接口的细节,引入fd(文件描述符)
4.fd的周边问题(fd的理解、fd和file的关系、fd分配规则、fd重定向…)

复习C语言的接口

C语言打开文件的方式有下列几种:
【lesson32】基础IO之复习C语言的接口_第1张图片
C语言打开文件的基本逻辑
【lesson32】基础IO之复习C语言的接口_第2张图片
运行代码
【lesson32】基础IO之复习C语言的接口_第3张图片
我们发现当前路径下多了一个log.txt文件。这是因为如果log.txt文件不存在该函数以W形式打开就会创建一个,如果log.txt文件存在就不会创建。

log.txt文件是进行通过调用系统接口创建的

什么叫当前路径?
用代码告诉大家
【lesson32】基础IO之复习C语言的接口_第4张图片
打开两个终端,一个运行代码的可执行程序
【lesson32】基础IO之复习C语言的接口_第5张图片
一个查看当前进行
【lesson32】基础IO之复习C语言的接口_第6张图片
我们可以看到许多信息
其中cwd就是可执行程序的当前路径
我们再把exe文件拷贝到~(工作目录)中运行
【lesson32】基础IO之复习C语言的接口_第7张图片
【lesson32】基础IO之复习C语言的接口_第8张图片
我们可以看到进程的cwd当前路径也随之发生变化。
所以这里我们可以得出结论。
cwd:当前进程的工作路径,当一个进程运行起来的时候,每一个进行都会记录自己当前所处的工作路径。

明白了当前路径接下来准备开始对文件操作。
代码
【lesson32】基础IO之复习C语言的接口_第9张图片
运行代码
【lesson32】基础IO之复习C语言的接口_第10张图片
我们看到原先没有内容的log.txt在代码运行后瞬间就有内容了。

这时候就有一个问题了,字符串写入文件中要加’\0’吗?
如果要加’\0’,strelen(s1)要不要+1?

答案:全都不需要,'\0'结尾是C语言的规定,文件不用遵守!文件要保存的是有效数据!

以w方式打开文件的时候是先清空,然后再写入。
演示
代码:
【lesson32】基础IO之复习C语言的接口_第11张图片

【lesson32】基础IO之复习C语言的接口_第12张图片
更改打开文件的方式为a
【lesson32】基础IO之复习C语言的接口_第13张图片
多次运行代码
【lesson32】基础IO之复习C语言的接口_第14张图片
我们发现以a方式打开文件。不会清空文件数据,而是直接添加在该数据的后面也叫追加。

从文件中按行读取代码,然后向显示器打印。
代码:

#include
#include
#include
#include
#include
int main()
{
  //打开文件(以只读的方式打开文件)
  FILE* file = fopen("log.txt","r");
  printf("process id:%d\n",getpid());

  //差错处理
  if(file == NULL)
  {
    //打开文件失败,打出失败原因
    perror(strerror(errno));
  }
  else
  {
    //对文件进行操作   
    //内容保存区                                                                                                                                         
    char s1[64];
    //按行读取文件
    while(fgets(s1,sizeof(s1),file) != NULL)
    {
    	//向显示器打印内容
       fprintf(stdout,s1,NULL);
    }
  }

  //关闭文件
  fclose(file);
  return 0;
}

运行结果
【lesson32】基础IO之复习C语言的接口_第15张图片
运行后我们发现程序相当于cat指令

但是cat可以查看任意文件,我们的程序只能查看指定文件。
开始修改程序,让它可以达到cat的程度。

#include    
#include    
#include    
#include    
#include    
#include    
                                                                                                                                                                        
//argc 参数个数    
//argv 参数数组    
//理想运行情况 ./test + 文件名    
int main(int argc,char* argv[])    
{    
  if(argc != 2)    
  {    
    printf("使用格式不对,计划:./test + 文件名\n");    
    exit(1);    
  }    
  //打开文件    
  FILE* file = fopen(argv[1],"r");    
  //printf("process id:%d\n",getpid());    
    
  //差错处理    
  if(file == NULL)    
  {    
    //打开文件失败,打出失败原因    
    perror(strerror(errno));    
  }    
  else    
  {    
    //对文件进行操作    
    char s1[64];//内容保存区
    //按行读取文件
    while(fgets(s1,sizeof(s1),file) != NULL)
    {
      //向显示器打印内容
      fprintf(stdout,s1,NULL);
    }
  }

  //关闭文件
  fclose(file);
  return 0;
}

运行程序
【lesson32】基础IO之复习C语言的接口_第16张图片
我们也可以把程序名改为cat
【lesson32】基础IO之复习C语言的接口_第17张图片
【lesson32】基础IO之复习C语言的接口_第18张图片
我们看到程序的功能,确实和cat一样了,可以查看任意文件。

我们之前可能听说过 系统默认打开三个标准输入输出流
stdin 键盘
stdout 显示器 一切皆文件
stderr 显示器

也就是三个文件指针
【lesson32】基础IO之复习C语言的接口_第19张图片
以上最多只能按照C语言的方式来理解。

你可能感兴趣的:(linux,c语言,java,服务器,linux)