【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:写入对应目标文件

代码

cpp 复制代码
#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

怎么理解文件缓冲区

显示器采用的刷新策略为行缓冲

文件采用的缓冲策略为全缓冲

相关推荐
ice___Cpu23 分钟前
Linux 基本使用和 web 程序部署 ( 8000 字 Linux 入门 )
linux·运维·前端
z2023050825 分钟前
linux 之0号进程、1号进程、2号进程
linux·运维·服务器
狐心kitsune1 小时前
erlang学习:Linux常用命令1
linux·学习·erlang
DREAM依旧2 小时前
《深入了解 Linux 操作系统》
linux
阿赭ochre2 小时前
Linux环境变量&&进程地址空间
linux·服务器
Iceberg_wWzZ2 小时前
数据结构(Day14)
linux·c语言·数据结构·算法
可儿·四系桜2 小时前
如何在多台Linux虚拟机上安装和配置Zookeeper集群
linux·服务器·zookeeper
Flying_Fish_roe2 小时前
linux-软件包管理-包管理工具(Debian 系)
linux·运维·debian
大广-全栈开发3 小时前
centos 7 安装gitlab
linux·git·centos
666786663 小时前
Mysql高级篇(中)—— SQL优化
linux·运维·服务器·数据库·sql·mysql