静态库和动态库/文件描述符与文件指针/文件操作/重定向

2023-05-16

c语言阶段学习文件操作复习

1 打开文件

FILE fopen(const char path, const char* mode)**
path:需要打开的文件路径,可以是绝对路径,也可以是相对路径
mode:以什么方式打开文件

  • r:以模式打开文件,如果文件不存在,则报错
  • r+:以读写模式打开文件,如果文件不存在,则报错
  • w:以模式打开文件,如果文件不存在则创建文件。如果文件存在,则清空文件内容,文件流指针指向文件的头部。
  • w+:以读写模式打开,如果文件不存在则创建文件。如果文件存在,则清空文件内容,文件流指向文件的头部。
  • a:以追加模式打开,如果文件不存在则创建文件;并不能对文件进行读,只能在文件的末尾进行追加写
  • a+:以追加模式打开,如果文件不存在则创建文件,支持读文件,在文件的末尾进行写。

返回值:返回了文件流指针
fclose(fp);//使用完文件指针函数后需要关闭文件流指针,否则会导致内存泄漏

2 读文件

**size_t fread(void ptr, size_t size, size_t nmemb, FILE stream);
ptr:将读到的内容保存在ptr当中
size:块的大小,单位是字节
nmemb:块的个数,期望读到的个数
size * nmemb,单位是字节,用来衡量总共读到的字节数量,如果size不为1,块的大小不为1,则不能返回值来讲读到了多少字节。
常见用法:将size置为1,每一块的大小就是1;要从文件中读多少字节,就设置多少块就可以了。
stream:文件流指针,从哪里读
返回值:返回成功读到的文件块的个数,实际读到的个数
在这里插入图片描述

3 写文件

**size_t fread(void ptr, size_t size, size_t nmemb, FILE stream);
ptr:要往文件当中写的内容
size:块的大小,单位是字节
nmemb:块的个数,期望读到个数,判断写了多少字节,size * nmemb
一般用法:将size设置为1,意味着块的个数就相当于写多少个字节。
stream:文件流指针,往哪里写
返回值:返回成功写入块的个数
在这里插入图片描述

系统调用的文件操作

1 open(const char* filename, int falgs, mode_t mode)

filename:待打开的文件名称
flags:以何种方式打开

  • O_RDWR:以读写 模式打开
  • O_RDONLY:以读模式打开
  • O_ERONLY:以写模式打开
  • O_CREAT:如果文件不存在,则创建文件
    mode:对于新创建出来的文件,设置文件权限
    返回值:返回文件描述符
    查看进程pid:ps aux | grep [xxx] --> 进程PID
    查看进程打开的文件资源:cd /proc/[pid]/fd -->打开的文件资源
    实例代码如下:
    == 问题1:文件描述符为啥是3?==
    在这里插入图片描述
    执行上述代码后,ps aux | grep sysfileoper查看当前进程的PID为13349
    在命令行一栏输入:cd /proc/13349后,ls查看当前进程中文件资源如下
    在这里插入图片描述
    进入fd文件,ll查看进程状态:
    在这里插入图片描述
    其中上图中0代表标准输入,1代表标准输出,2代表标准错误。
    也就是说启动任何一个程序,操作系统都会打开三个文件描述符,标准输入,标准输出,标准错误。所以,当程序中新打开的文件描述符,就会一次往下去排布(粗略理解)
    == 问题2:打开模式,不同的宏在组合的时候为什么要按位或?==
    在这里插入图片描述
    进一步说明:
    在这里插入图片描述

2 常用的系统调用函数

ssize_t write(int fd,const void buf,size_t count)*
fd:文件操作符
buf:写入的数据
count:写入的数据大小(单位是字节)
**
ssize_t read(int fd, void* buf, size_t count)**
fd:文件操作符,从哪里进行读
buf:读到哪里去(程序员在代码当中定义的缓冲区)
count:最大可以读多少个字节,注意要预留 \0 的位置,否则会导致在访问buf的时候可能会产生越界访问,导致程序崩溃。

off_t lseek(int fd, off_t offset, int whence)
fd:文件操作符
offset:偏移量
whence:偏移到哪
SEEK_SET:偏移量放到当前文件操作的首部
SEEK_CUR:偏移量放到当前文件操作的位置
SEEK_END:偏移量放到当前文件操作的尾部

int close(int fd)
如果一味的在程序中打开文件,而不去关闭文件,最终会受到open files的限制

文件描述符

文件描述符就是一个正整数
在这里插入图片描述
文件描述符就是内核当中维护fd_array数组下标,下标是从0开始的,所以文件描述符是一个正整数;
当程序员操作文件的时候,其实就是通过文件描述符,找到fd_array数组当中对应的元素,每一个元素对应一个文件信息,内核通过操作数组元素对应的文件信息,找到对应的文件,从而实现文件操作。

文件描述符的分配规则
创建一个进程就会默认打开标准输入、标准输出、标准错误着三个文件描述符。
在这里插入图片描述
用close(0)关闭0号位置的文件描述符,新打开文件描述符后占用的是0号位置。
使用规则:最小末占用规则,只要fd_array数组当中从小到大,哪个位置没有占用,则新打开的文件就会占用该位置。

文件描述符与文件指针的关系

fopen/fread/fwrite/fseek/fclose ==> 文件流指针 ==>C库当中的函数
open/read/write/lseek/close ==>文件描述符 ==>系统调用函数
文件流指针:typedef struct _10_FILE FILE,文件流指针本质是一个结构体,而这个结构体是struct _10_FILE,如下图所示。
在这里插入图片描述

  • 之前在进程终止章节,刷新了缓冲区,其实刷新的是C库当中维护的缓冲区,并非是内核当中维护的。
    exit() —> 刷新缓冲区 —> C库函数
    _exit() —> 不会刷新缓冲区 —> 系统调用
  • 为什么使用文件流指针的时候,打印内容的时候,如果不加上\n或者强制刷新缓冲区的操作,我们输出的内容就不会立即打印到屏幕上,因为不加上\n,输出的内容就一直停留在写缓冲区上。
  • 当我们在使用文件流指针的时候,其实文件流指针对应的数据结构内容也保存了对应的文件描述符,当使用流指针进行读写的时候,其实也是C库当中操作文件描述符来完成读写的。
    在这里插入图片描述

重定向

printf(“hello world\n”) ==> 标准输出
现在想让“hello world”字符串输出到文件当中
在这里插入图片描述

文件接口函数:int dup2(int oldfd, int newfd), oldfd和newfd都是文件描述符,其中newfd拷贝oldfd内容
eg:想要标准输出变成一个程序员打开的文件
dup2(3, 1);
注意:如果oldfd是一个无效的文件描述符,则dup2什么事情都不需要干,newfd还是指向原来的文件;如果newfd和oldfd是同样的值,则dup2什么事情都不干。错误,返回值小于1。

命令行当中重定向:
在这里插入图片描述

静态库和动态库

为了将完成将某项功能的函数,打包起来放到一起,提供给别人一起使用。为了保护商业秘密。

动态库

1 后缀:在win下:xxxx.dll 在Linux下:libxxxx.so
2 动态库如何去生成与使用
动态库的生成需要:

  • 1 gcc/g++:编译器
  • 2 命令行参数:-shared:生成共享库的命令行参数;-fPIC:产生位置无关的代码。
    eg:创建一个新的test.c文件,使用 gcc -shared -fPIC test.c -o libtest.so, 生成动态库文件,ls查看后如下:
    在这里插入图片描述
    动态库的使用:
    gcc/g++命令行当中
    -L [path]:指定链接的库文件路径 -l [库名称(去掉前缀,也去掉后缀)] 指定可执行程序在编译过程中依赖的库文件
    在这里插入图片描述
    在这里插入图片描述
    使用== gcc main.c -L . -ltest ==,虽然在mian.c中没有声明print()函数,但依旧可以用。
    在这里插入图片描述
    ldd a.out查看可执行程序依赖的库文件,可以看到有libtest.so这个动态库文件,如下:

    以上操作都是动态库和可执行程序在一个文件下才可以实现,问题无论将程序依赖的动态库放到哪里,都可以使程序找到自己依赖的动态库?
  1. 将动态库放到可执行程序的目录下,可执行程序会搜索当前的目录。
  2. 环境变量
    LD_LIBRARY_PATH:保存动态库的搜索路径
    首先查看一下当前的环境变量,此时动态库没有在当前路径下,在/home/wudu下:
    在这里插入图片描述
    在命令行中输入:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/wudu,先将原来的环境变量加入,再将动态库的路径加到后面即可,加入后结果如下:
    在这里插入图片描述
    查看可执行程序的环境变量后,可以看到动态库添加成功:
    在这里插入图片描述
    LD_LIBRARY_PATH环境变量中有,PATH1:、PATH2:、PATH3:、…只需要将程序依赖的动态库所在的路径保存在该环境变量当中即可,可执行程序在执行的时候,能够通过LD_LIBRARY_PATH环境变量找到搜索到动态库在哪里,从而在可执行程序的时候,就能够找到动态库了。
  3. 不推荐使用!!!
    将自己写的库文件或者第三方的库文件和操作系统以来的库文件放在一起,目录是/user/lib64

静态库

1 后缀:在win下:xxxx.lib,在win环境下编译一个依赖库的可执行程序的时候,编译阶段的时候依赖的静态库(.lib),程序运行阶段依赖是动态库(.dll)
  在Linux下:libxxxx.a
2 静态库的生成和使用
静态库的生成:生成静态库的时候,需要使用.o文件来进行编译生成。

  1. 使用的参数是ar,命令行参数-rc,生成静态库如下:
    在这里插入图片描述
    静态库的使用:
    gcc/g++命令行当中
    -L [path]:指定链接的库文件路径 -l [库名称(去掉前缀,也去掉后缀)] 指定可执行程序在编译过程中依赖的库文件
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

静态库和动态库/文件描述符与文件指针/文件操作/重定向 的相关文章

  • 基于linux下python的学习(文件操作、模块)

    一 文件操作 操作文件的函数 方法 在python中要操作文件需要记住的1个函数和3个方法 python中一切皆对象 open 打开文件 xff0c 并且返回文件操作对象 read 将文件内容读取到内存 write 将指定内容写入文件 cl
  • C#文件操作

    在前面操作变量和常量时这些值都是存放到内存中的 xff0c 当程序运行结束后使用的数据全部被删除 若需要长久保存应用程序中的数据 xff0c 可以选用文件或数据库来存储 文件通常存放到计算机磁盘上的指定位置 xff0c 可以是记事本 Wor
  • C++文件操作

    文章目录 计算机文件到底是什么 xff08 通俗易懂 xff09 xff1f C 43 43 文件类 xff08 文件流类 xff09 及用法详解C 43 43 open 打开文件 xff08 含打开模式一览表 xff09 使用 open
  • Hadoop之HDFS文件操作

    摘要 xff1a Hadoop之HDFS文件操作常有两种方式 xff0c 命令行方式和JavaAPI方式 本文介绍如何利用这两种方式对HDFS文件进行操作 关键词 xff1a HDFS文件 命令行 Java API HDFS是一种分布式文件
  • 问题集合 ---- linux 静态库和动态库

    本文转自多网址 xff0c 对作者表示感谢 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61
  • Groovy学习-IO/文件操作

    读取文件 读取文本文件并打印每一行文本 new File 39 39 39 a txt 39 eachLine line gt println line eachLine方法是Groovy为File类自动添加的方法 xff0c 同时提供多个
  • io流读写文件(文件内容修改)

    package cn sos psasps import java io BufferedReader import java io BufferedWriter import java io FileReader import java
  • qt中设置文件保存的几种方式

    归纳总结4种qt常用的文件保存的方式 1 需要用到的头文件 include
  • qt操作文件进行读写操作

    一 加上头文件 include
  • shell编程范例之文件操作

    by falcon 2007 11 5 这一周我们来探讨文件操作 在日常学习和工作中 我们总是在不断的和各种文件打交道 这些文件包括普通的文本文件 可以执行的程序文件 带有控制字符的文 档 存放各种文件的目录文件 网络套接字文件 设备文件等
  • 自己动手写一个key value store

    一涉及到persistent 哪怕只是最基本的需求 很多人都会依赖数据库 或是其他现成的库或工具 确实 对于文件 大部分人很少直接打交道 或者只是诸如整体反序列化 序列化 按行读取 append new line等有限的操作 一个persi
  • java导入csv格式文件之身份证格式处理

    一 出现的问题 csv中的身份证号如下图 导到数据库中的结果 因此怎样导入才能使身份证能够正常导入呢 2 解决方案 第一步 选中身份证那一列 第二步 右键选择 设置单元格格式 第三步 数字列中 选择 特殊 gt 邮政编码 点击确定
  • win7及以上系统C++实现Hook explorer文件级监控复制、剪切和删除操作

    最近项目组需要实现一个对windows用户文件操作进行监控的功能 也就是使用explorer资源管理器的操作 于是乎我就想到了使用Hook的方法进行拦截 查找一番资料后发现XP调用的是最简单的CopyFileEx MoveFileWithP
  • BigQueue:The Architecture and Design of a Publish & Subscribe Messaging System Tailored for Big Data

    The Architecture and Design of a Publish Subscribe Messaging System Tailored for Big Data Collecting and Analytics MAR 2
  • LinuxC文件操作接口

    LinuxC文件操作接口 创建与删除 创建文件 FILE fopen const char filename const char mode int open const char pathname int flags mode t mod
  • 一个开发的记单词小程序

    这里写目录标题 效果演示 功能1测试 功能简介 代码实现 效果演示 输入1 敲下Enter 回车键 后 进入第一个功能英译汉 给出Hello 用户输入中文意思 你好 敲下回车确定 进入下一个单词 功能1测试 功能简介 1 分别编辑中文和英文
  • JS获取本地图片和网络图片的宽高尺寸和存储大小

    最新更新时间 2020年07月08日09 13 28 猛戳 查看我的博客地图 总有你意想不到的惊喜 本文内容 图片作为一种记录信息的载体 比文本更加生动 比视频更加精简 在日常生活中的用处很大 作为前端开发人员 操作图片的场景非常多 本文记
  • C#常用代码

    最近学习用C 写了几个程序 记录一下常用的几个操作 方便以后Copy 文件操作 FileStream fs null try byte buf FileStream fs new FileStream strSampleFileName F
  • C# 文件操作之创建文件夹

    本文章主要是讲述C 中文件操作的基础知识 如何创建文件夹 创建文件 介绍Directory类 DirectoryInfo类和使用FolderBrowserDialog组件 文件夹对话框 文章属于基础知识 参考了书籍刘丽霞 C 范例开发大全
  • C语言文件操作收尾【随机读写 + 结束判定 + 文件缓冲区】

    全文目录 前言 fseek 重定位位置指示器函数 ftell 获取当前文件指示器的位置 rewind 重置位置指示器 文本文件和二进制文件 文件读取结束的判定 feof 和 ferror 文件缓冲区 总结 前言 有了文件的顺序读写基础 那么

随机推荐

  • Qt自定义控件——动态圆形进度条

    文章目录 前言一 需求二 实现1 自定义控件类2 提升3 效果 前言 本篇通过提升法实现一个动态圆形进度条 一 需求 自定义实现一个动态圆形进度条 xff0c 支持设置进度条颜色 目标值背景色 外边框背景色 中央圆环背景色 旋转角度及大小自
  • linux下可视化git工具git-cola安装与使用(SSH方式)

    一 git cola为何物 很多小伙伴 xff0c 特别喜欢使用TortoiseGit xff0c 该软件是做什么的 xff0c 就不用多说吧 奈何 xff0c TortoiseGit只有windows版 xff0c 这让在linux上开发
  • 智能优化算法:布谷鸟搜索算法-附代码

    智能优化算法 xff1a 布谷鸟搜索算法 附代码 文章目录 智能优化算法 xff1a 布谷鸟搜索算法 附代码1 算法原理2 算法结果3 参考文献4 Matlab代码 摘要 xff1a 谷鸟搜索算法 cuckoo search cs xff0
  • 基于布谷鸟优化的BP神经网络(预测应用) - 附代码

    基于布谷鸟优化的BP神经网络 xff08 预测应用 xff09 附代码 文章目录 基于布谷鸟优化的BP神经网络 xff08 预测应用 xff09 附代码1 数据介绍3 CS优化BP神经网络3 1 BP神经网络参数设置3 2 布谷鸟算法应用
  • 基于粒子群优化的BP神经网络(分类应用) - 附代码

    基于粒子群优化的BP神经网络 xff08 分类应用 xff09 附代码 文章目录 基于粒子群优化的BP神经网络 xff08 分类应用 xff09 附代码1 鸢尾花iris数据介绍2 数据集整理3 粒子群优化BP神经网络3 1 BP神经网络参
  • Arm Keil MDK v5.30版本官宣,快来下载!

    近日 xff0c Arm很高兴地宣布发布Arm Keil MDK v5 30 此版本新增了对Cortex M55处理器和CMSIS Build的支持 xff0c 更新包括Arm Compiler 6 14 xff0c CMSIS 5 7 0
  • ubuntu下访问串口

    前言 最近准备将windows上自动瞄准的程序移植到linux xff0c 第一步准备调试一下ubuntu下的串口 在网上搜到一个串口库 xff0c 于是就拿来调用 xff0c 最后调试成功 过程如下 xff1a 过程 1 下载Serial
  • 热备笔记实验

    早上突然断电 本来笔记本的插头就忘记插了 xff0c 电池没用多久就熄火 最纳闷的是接入电源后本机数据库竟然挂掉了 xff0c 嘿嘿 xff0c 正好试一试前几天应用的热备回复 以下是我的全程 C Documents and Setting
  • Android学习之AIDL添加Service权限

    参考 Android开发艺术探索 xff0c 书中提供了两种方法 第一种方法 xff1a 在onBind中验证 在服务端的AndroidManifest添加自定义权限 lt permission android name 61 span c
  • ADRC(自抗扰控制器)技术附Matlab代码框架

    自抗扰控制器 Auto Active Disturbances Rejec ion Controller ADRC 是韩京清学者提出的 xff0c 是一种继PID控制器后的一种新型的实用的控制技术 它不是一种独立的技术 xff0c 可以理解
  • git视频及对初学者的学习建议

    http herry2013git blog 163 com blog static 21956801120144810133569 http herry2013git blog 163 com blog static 2195680112
  • 迷你光流使用说明

    为了让你有兴趣往下学习 xff0c 先上个定点悬停效果视频给你欣赏一下吧 xff01 点击打开视频链接 首先 xff0c 简单介绍一下我使用的这款光流传感器 长宽高 xff1a 14x11x5mm xff0c 重量约0 6克 xff0c 工
  • Handler的使用方法(一)

    想花点时间谈谈Handler的使用方法 xff0c 是应为Handler的使用涉及到了线程类的使用 xff0c 也是在程序中用到了线程 xff0c 关于线程 xff0c 是个很重要的概念 xff0c 因为以后的嵌入式系统的应用开发往往在程序
  • STM32控制APM飞控(二)MAVLINK源码集成到stm32工程中

    MAVLINK协议源码集成到32工程中 一 MAVLINK代码转化为C语言源码文件 主要根据 http www cnblogs com lovechen p 5801679 html 作者 恒久力行 的方式 xff0c 我进行归纳简要说明
  • STM32控制APM飞控(三)MAVLINK整合并适配stm32串口的收发

    目录 stm32底层串口代码更改能收发MAVLINK协议包 一 在上一次移植好的工程基础上进行如下改动
  • STM32控制APM飞控(五)MAVLINK的C源码的解释及MAVLINK心跳包

    MAVLINK的C源码的解释及MAVLINK心跳包 一 MAVLINK转化成C源码后的文件及文件夹解释 用pathon2 7将从github官网下载下来的MAVLINK源码转换成c语言源码的文件夹如图 xff1a 解释 xff1a a xf
  • (一) 概述(概念、组件、架构、适用场景) | 普罗米修斯(Prometheus)

    什么是普罗米修斯 xff1f Prometheus是一个开源系统监控和警报工具包 xff0c 最初在 SoundCloud构建 自 2012 年成立以来 xff0c 许多公司和组织都采用了 Prometheus xff0c 该项目拥有非常活
  • 多值依赖

    多值依赖 xff1a 比如 xff1a 学校中某一门课程由多个教员讲授 xff0c 他们使用相同的一套参考书 每个教员可以讲授多门课程 xff0c 每种参考书可以供多门课程使用 我们可以用一个非规范化的关系来表示教员T 课程C 和参考书B
  • Docker启动Mysql问题汇总

    最近在学习Docker技术 xff0c 遇到了不少问题 xff0c 记录分享一下 xff0c 感觉有用的可以参考一下 xff1b 1 Docker使用Mysql docker run d v opt data mysql02 var lib
  • 静态库和动态库/文件描述符与文件指针/文件操作/重定向

    c语言阶段学习文件操作复习 1 打开文件 FILE fopen const char path const char mode path xff1a 需要打开的文件路径 xff0c 可以是绝对路径 xff0c 也可以是相对路径 mode x