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

news2024/11/24 9:18:57

文件的描述符和重定向

      • C语言的文件读写操作
        • 代码
      • open系统打开文件方法
      • 系统读写文件操作
      • 文件描述符
      • 文件重定向
      • 怎么理解文件缓冲区

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在这里插入图片描述
在这里插入图片描述

怎么理解文件缓冲区

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/904678.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

halcon库文件封装操作方法介绍

头文件写法参考 getarea.h 导出函数设定&#xff1a; extern “C” __declspec(dllexport) void _stdcall cpp文件写法参看 3.vs 库文件配置介绍 头文件及包含的库文件目录设定 &#xff08;1&#xff09;头文件设定E:\halcon\env\opencv\include\opencv2;E:\halcon\env\ope…

接口限流注解 RateLimiter (现成直接用)

1. 限流注解 import com.ruoyi.common.constant.Constants; import com.ruoyi.common.enums.LimitType;import java.lang.annotation.*;/*** 限流注解* */ Target(ElementType.METHOD) Retention(RetentionPolicy.RUNTIME) Documented public interface RateLimiter {/*** 限流…

DSO 系列文章(3)——DSO后端正规方程构造与Schur消元

文章目录 DSO代码注释&#xff1a;https://github.com/Cc19245/DSO-CC_Comments

javascript期末作业【三维房屋设计】 【文末源码+文档下载】

1、引入three.js库 官网下载three.js 库 放置目录并引用 引入js文件: 设置场景&#xff08;scene&#xff09; &#xff08;1&#xff09;创建场景对象 &#xff08;2&#xff09;设置透明相机 1,透明相机的优点 透明相机机制更符合于人的视角,在场景预览和游戏场景多有使用…

安装docker配置镜像加速器,容器等

1.安装docker服务&#xff0c;配置镜像加速器 2.下载系统镜像&#xff08;Ubuntu、 centos&#xff09; 3.基于下载的镜像创建两个容器 &#xff08;容器名一个为自己名字全拼&#xff0c;一个为首名字字母&#xff09; 4.容器的启动、 停止及重启操作 5.怎么查看正在运行的容器…

快速排序 | C++|时间空间复杂度

1.概念 快速排序(QuickSort)的基本思想是:通过一趟排序将待排记录分割成独立的两部分&#xff0c;其中一部分记录的关键字均比另一部分记录的关键字小&#xff0c;则可分别对这两部分记录继续进行排序&#xff0c;以达到整个序列有序的目的。 2.算法思想描述 1.进行一次划分&…

在线HmacMd5加密工具--在线获取哈希值又称摘要

具体请前往&#xff1a;在线计算HMacMd5工具

STL vector基本用法

目录 vector介绍vector的使用vector的定义vector接口函数构造函数和赋值重载迭代器元素访问vector容量相关函数vector增加 删除 修改操作关系操作符 vector介绍 vector是可变大小数组的序列容器。像数组一样&#xff0c;vector也采用的连续存储空间来存储元素。也就是意味着可…

Dockers搭建个人网盘、私有仓库,Dockerfile制作Nginx、Lamp镜像

目录 1、使用mysql:5.6和 owncloud 镜像&#xff0c;构建一个个人网盘。 &#xff08;1&#xff09;下载mysql:5.6和owncloud镜像 &#xff08;2&#xff09;创建启动mysql:5.6和owncloud容器 &#xff08;3&#xff09;在浏览器中输入网盘服务器的IP地址&#xff0c;进行账…

stm32单片机/51单片机蜂鸣器不响(proteus模拟)

蜂鸣器不发生原因就1个&#xff1a;电压不够 所以需要提高蜂鸣器2端的电压&#xff1a;可以采用的方法有&#xff1a; 1提高蜂鸣器电阻&#xff0c;这样根据分压原理&#xff0c;可以提升蜂鸣器2段电压 2更改蜂鸣器的工作电压为更小的值&#xff0c;这个可以通过在proteus内…

虚拟机中docker承载的微服务注册到nacos无法访问问题

今天将一个项目中的部分子系统部署&#xff0c;部署到虚拟机的docker里运行&#xff0c;结果外部无法访问。查看nacos&#xff0c;显示服务已经成功注册。 后来发现&#xff0c;该服务的IP地址外部无法访问&#xff1a; 估计172.17.0.0是docker自身的网段&#xff0c;在上面跑…

【MyBatis面试题(20道)】

文章目录 MyBatis 面试题&#xff08;20道&#xff09;基础1.说说什么是MyBatis&#xff1f;2.Hibernate和MyBatis有什么区别&#xff1f;3.MyBatis使用过程&#xff1f;生命周期&#xff1f;4.在mapper中如何传递多个参数&#xff1f;5.实体类属性名和表中字段名不一样&#x…

BDA初级分析——SQL多表连接应用

一、用SQL拼接数据 三个初始数据 问题1&#xff1a;在所有的数据里&#xff0c;销售额最高的产品品类名是什么&#xff1f; 问题2&#xff1a;是否有什么产品是在所观测的时间里没有被购买过的&#xff1f; 拼接数据&#xff1a;JOIN join&#xff0c;加入 作用&#xff1…

crontab下定时任务批量注释和批量放开

背景&#xff1a;实际项目中我们在Linux系统中用crontab配置了上百个定时任务&#xff0c;有的时候做配置修改等需要同时注释掉这些任务&#xff0c;让它们都不在执行&#xff0c;找了一会儿终于发现了解决办法&#xff0c;&#x1f604; 模拟项目中的任务如下 我就随机写了两…

最快的JS甘特图:Bryntum Gantt 5.5.1 Crack

最快的JS甘特图 Bryntum Gantt 是一个超快速且完全可定制的甘特图套件&#xff0c;适用于您的 React / Angular / Vue / JS 应用程序。 快如闪电 甘特图是用纯 JavaScript / ES6 构建的&#xff0c;并使用非常快速的渲染引擎。这意味着您可以加载大型数据集&#xff0c;并且仍然…

MNN学习笔记(八):使用MNN推理Mediapipe模型

1.项目说明 最近需要用到一些mediapipe中的模型功能&#xff0c;于是尝试对mediapipe中的一些模型进行转换&#xff0c;并使用MNN进行推理&#xff1b;主要模型包括&#xff1a;图像分类、人脸检测及人脸关键点mesh、手掌检测及手势关键点、人体检测及人体关键点、图像嵌入特征…

嵌入式:ARM Day6

作业:完成cortex-A7核UART总线实验 目的&#xff1a;1.输入a,显示b&#xff0c;将输入的字符的ASCII码下一位字符输出 2.原样输出输入的字符串 源码&#xff1a; uart4.h #ifndef __UART4_H__ #define __UART4_H__#include "stm32mp1xx_rcc.h" #incl…

个人论坛项目测试报告

目录 0.项目概述及部分测试用例展示 以下是部分测试用例&#xff1a; 进行一般的性能测试性能测试 1.摘要及版本修订记录 2.功能介绍 3.测试范围 3.1.功能性 3.2.可靠性 3.3.易用性 4.测试资源 4.1.人员介绍 4.2.测试环境 4.2.测试工具 5.测试策略 5.2.功能测试…

Vivado使用入门之三:I/O约束

一、导图概览 二、I/O约束 2.1 I/O约束的内容 I/O约束主要是对port的位置和电气特性进行设置&#xff0c;进入菜单栏Window的IO Ports&#xff0c;可以查看可约束的相关内容。 一些port的常用特性解释如下 Name: port的名称 Direction:port的输入输出类型&#xff0c;有三种…

后端开发12.商品模块

概述 简介 商品模块这个设计的非常复杂 效果图 数据库