【Linux】文件的描述符和重定向

C语言的文件读写操作

文件写入
fputs
int fputs(const char *s, FILE *stream);
s:要写入的字符串
stream:要写入对应的目标文件

文件输出(只可以在文件读的环境下运行 r)
fgets
char *fgets(char *s, int size, FILE *stream);
s:要保存到的目标位置
size:输出多少字节
stream:输出的目标文件

文件写入
**fprintf
int fprintf(FILE *stream, const char *format, …);
stream:写入的目标文件
format:要写入的字符串
…:代表可以写入多组

snprintf(将字符串写入数组,不是文件写入)**
int snprintf(char *str, size_t size, const char *format, …);
str:需要存入目标数组
size:存取多大
format:对应的字符串目标

二进制文件的输出输入
fread
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
fwrite
size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);

文件写入
fscanf函数会从文件输入流中读入数据,存储到format中,遇到空格和换行时结束。
fscanf
int fscanf(FILE *stream, const char *format, …);
stream:写入对应目标文件
在这里插入图片描述

在这里插入图片描述

代码

#include <stdio.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#include <sys/stat.h>
#include <unistd.h>
#define LOG "log.text"
int main()
{
    
    
  //w:默认为写方式打开文件,如果文件不存在,就会创建出来
  FILE* fp = fopen(LOG,"w");
  if(fp == NULL)
  {
    
    
    perror("fopen");
    return 1;
  }

  //正常进行文件操作
  const char* msg = "hello new file";
  int cnt  = 1;
  char buffer[256];
  while(cnt)
  {
    
    
    //C语言文件写操作
    //snprintf(buffer,sizeof(buffer),"%s:%d:wh\n",msg,cnt);
    //printf("%s",buffer);
    //fprintf(fp,"%s : %d : wh\n",msg,cnt);
    //fprintf(stdout,"%s : %d : wh",msg,cnt); 
    //fprintf(stdout,msg,NULL);//Linux一切皆文件,stdout也对应一个文件,显示器文件 
    fputs(msg,fp);

    --cnt;
  }
    char line[128];
    //只可以在读的环境下读取   r
    if(fgets(line,sizeof(line),fp) == NULL)
    {
    
    
      perror("fgets");
    }
    else printf("%s",line);

  fclose(fp);
  return 0;
}



open系统打开文件方法

open
#include <fcntl.h>
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
pathname:要创建的文件名
flags:它的操作类型

  • O_RDONLY: 只读打开
  • O_WRONLY: 只写打开
  • O_RDWR : 读,写打开
  •  这三个常量,必须指定一个且只能指定一个
    
  • O_CREAT : 若文件不存在,则创建它。需要使用mode选项,来指明新文件的访问权限
  • O_APPEND: 追加写
    在这里插入图片描述
  • O_TRUNC:清空文件所有内容
    在这里插入图片描述

mode:给文件设置权限

系统读写文件操作

文件写入
write
#include <unistd.h>
ssize_t write(int fildes, const void *buf, size_t nbyte);
write返回写入多少个字节包括\0在这里插入图片描述

文件读出
read
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
在这里插入图片描述

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

文件描述符

但用open打开或者创建一个文件的时候,系统会给我们返回一个整数,当返回 -1 时,说明创建文件失败,反之创建成功,当创建成功时,也会给我们返回一个整数值,这个值我们称之为文件描述符
我们修改文件时,都会用到操作符。

那么文件描述符是什么呢?
文件描述符是一个数组下标,代表的意义不同。
Linux进程默认情况下会有3个缺省打开的文件描述符,分别是标准输入>0, 标准输出1, 标准错误2
0,1,2对应的物理设备一般是:键盘,显示器,显示器
所以当我们在新建文件后,每个文件对应的描述符都是3,这是因为前三个都被占用了
在这里插入图片描述

文件存储规则。
当标准输入、输出、错误都占用时,文件会顺的数组顺序进行保存,如果前0、1、2出现文件关闭时。那么当文件保存的时候就会优先前面空余的部分。
在这里插入图片描述

文件重定向

如果不想占用前三个,我们可以手动更改标准输入、输出、错误的路径,也可以通过函数dup2来更改。
linux重定向常见方式有:1、标准输入输出重定向,使用 ‘>’ 或 ‘>>’ 符号实现;2、标准错误重定向,使用 ‘2>’ 符号来实现;3、输入流重定向,使用 ‘<’ 符号实现;4、管道重定向,使用 ‘|’ 符号实现。
在这里插入图片描述

手动更改
在这里插入图片描述

在这里插入图片描述

dup2()函数修改

int dup2(int oldfd, int newfd);
oldfd覆盖nwefd在这里插入图片描述
在这里插入图片描述

怎么理解文件缓冲区

显示器采用的刷新策略为行缓冲
文件采用的缓冲策略为全缓冲
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/wh9109/article/details/132381635