Linux文件描述符与FILE指针互相转换

目录

1、文件描述符转换为 FILE 指针

2、FILE 指针转换为文件描述符


在Linux中,文件描述符(file descriptor, fd)和FILE指针(也称为文件流指针,FILE pointer)是两种常见的文件操作接口。文件描述符是一个整数,通过系统调用直接操作文件,而FILE指针是通过C标准库函数操作文件。

  • 文件描述符(fd):由操作系统分配的一个整数标识符,用于标识打开的文件。常用的系统调用包括openreadwriteclose
  • FILE 指针:由C标准库管理的文件流指针,通过fopenfreadfwritefclose等库函数操作。

1、文件描述符转换为 FILE 指针

使用fdopen函数可以将一个已经打开的文件描述符转换为FILE指针。

函数原型如下所示:

FILE *fdopen(int fd, const char *mode);
  • 参数
    • fd:文件描述符。
    • mode:打开模式,与fopen类似,如"r""w""a"等。
  • 返回值:成功返回指向FILE对象的指针,失败返回NULL

示例如下:

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>int main() {// 打开一个文件并获得文件描述符int fd = open("example.txt", O_WRONLY | O_CREAT | O_TRUNC, 0644);if (fd == -1) {perror("Failed to open file");return 1;}// 将文件描述符转换为 FILE 指针FILE *file = fdopen(fd, "w");if (file == NULL) {perror("Failed to convert fd to FILE*");close(fd);return 1;}// 使用 FILE 指针进行写操作fprintf(file, "Hello, FILE pointer!\n");// 关闭 FILE 指针,注意这也会关闭文件描述符fclose(file);return 0;
}

2、FILE 指针转换为文件描述符

使用fileno函数可以从一个FILE指针中获取对应的文件描述符。

函数原型如下所示:

int fileno(FILE *stream);
  • 参数
    • stream:指向FILE对象的指针。
  • 返回值:返回文件描述符,如果出错返回-1

示例如下:

#include <stdio.h>int main() {// 打开一个文件并获得 FILE 指针FILE *file = fopen("example.txt", "w");if (file == NULL) {perror("Failed to open file");return 1;}// 从 FILE 指针中获取文件描述符int fd = fileno(file);if (fd == -1) {perror("Failed to convert FILE* to fd");fclose(file);return 1;}// 使用文件描述符进行写操作const char *text = "Hello, file descriptor!\n";if (write(fd, text, strlen(text)) == -1) {perror("Failed to write to file");}// 关闭 FILE 指针,这也会关闭文件描述符fclose(file);return 0;
}

注意事项

  • 文件描述符和 FILE 指针的关联fdopen函数返回的FILE指针和原始文件描述符是关联的。对FILE指针的操作会影响文件描述符,反之亦然。
  • 关闭文件:使用fclose关闭FILE指针时,底层文件描述符也会被关闭。因此,不要在关闭FILE指针后再次使用该文件描述符。
  • 缓冲问题FILE指针使用标准库缓冲机制,文件描述符直接操作文件。混合使用这两者时需要注意缓冲区的刷新问题,以避免数据不一致。

通过上述示例和说明,可以在Linux程序中灵活地在文件描述符和FILE指针之间转换,根据需要选择合适的接口进行文件操作。

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

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

相关文章

Cesium与Three相机同步(3)

Cesium与Three融合的案例demo <!DOCTYPE html> <html lang"en" class"dark"><head><meta charset"UTF-8"><link rel"icon" href"/favicon.ico"><meta name"viewport" content&q…

C++ 类和对象 构造函数

一 类的6个默认成员函数&#xff1a; 如果一个类中什么成员都没有&#xff0c;简称为空类。 例&#xff1a; #include <iostream> class Empty {// 空类&#xff0c;什么成员都没有 }; 空类中真的什么都没有吗&#xff1f;并不是&#xff0c;任何类在什么都不写时&a…

洛谷 P1035 [NOIP2002 普及组] 级数求和

本文由Jzwalliser原创&#xff0c;发布在CSDN平台上&#xff0c;遵循CC 4.0 BY-SA协议。 因此&#xff0c;若需转载/引用本文&#xff0c;请注明作者并附原文链接&#xff0c;且禁止删除/修改本段文字。 违者必究&#xff0c;谢谢配合。 个人主页&#xff1a;blog.csdn.net/jzw…

qt 读取配置文件

在Qt中读取配置文件&#xff0c;主要有以下几种方法&#xff1a; 使用QFile和QTextStream类&#xff1a; 这种方法适用于读取任意文本文件&#xff0c;包括配置文件。使用QFile的open()方法打开配置文件。使用QTextStream的readLine()方法逐行读取配置数据。使用QXmlStreamRea…

谷粒商城学习-笔记大全

1&#xff0c;谷粒商城-01-项目介绍 2&#xff0c;谷粒商城笔记-02-项目整体效果展示 3&#xff0c;谷粒商城笔记-03-分布式基础概念 4&#xff0c;谷粒商城笔记-04-项目微服务架构图简介 5&#xff0c;谷粒商城学习笔记-05-项目微服务划分图 6&#xff0c;谷粒商城学习-06-使用…

【LinuxC语言】手撕Http协议之accept_request函数实现(一)

文章目录 前言accept_request函数作用accept_request实现解析方法根据不同方法进行不同操作http服务器响应格式unimplemented函数实现总结前言 在计算机网络中,HTTP协议是一种常见的应用层协议,它定义了客户端和服务器之间如何进行数据交换。在这篇文章中,我们将深入探讨Li…

C++模块化之内部类

目录 1.引言 2.内部类的访问控制 3.优缺点分析 4.实际运用 4.1.实现复杂数据结构 4.2.封装细节实现 4.3.事件处理和回调 4.4.模板元编程辅助类 4.5. 访问控制和封装 4.6. 代码组织和模块化 5.总结 1.引言 在C中&#xff0c;内部类&#xff08;Nested Class&#xff…

力扣爆刷第159天之TOP100五连刷61-65(翻转单词、对称二叉树、遍历求和)

力扣爆刷第159天之TOP100五连刷61-65&#xff08;翻转单词、对称二叉树、遍历求和&#xff09; 文章目录 力扣爆刷第159天之TOP100五连刷61-65&#xff08;翻转单词、对称二叉树、遍历求和&#xff09;一、151. 反转字符串中的单词二、129. 求根节点到叶节点数字之和三、104. 二…

简单解读伦敦银CFD(XAG)走势图

从本质上说&#xff0c;伦敦银是一种差价合约&#xff08;CFD&#xff09;交易&#xff0c;在同平台所提供的MT4中&#xff0c;它的代码也许并不一样&#xff0c;有的平台会显示为XAG&#xff0c;有的平台会显示为LLS或Silver&#xff0c;但它们指的其实是同一个品种&#xff0…

Python学习笔记29:进阶篇(十八)常见标准库使用之质量控制中的数据清洗

前言 本文是根据python官方教程中标准库模块的介绍&#xff0c;自己查询资料并整理&#xff0c;编写代码示例做出的学习笔记。 根据模块知识&#xff0c;一次讲解单个或者多个模块的内容。 教程链接&#xff1a;https://docs.python.org/zh-cn/3/tutorial/index.html 质量控制…

基于单片机的防酒驾控制系统设计

摘 要&#xff1a; 酒后驾车的危害十分巨大&#xff0c;因此&#xff0c;笔者介绍了一种基于单片机的防酒驾控制系统。系统由酒精传感器 MQ-3测量汽车驾驶员体内的酒精含量浓度&#xff0c;通过 A/D 转换器转换成数字信号传给单片机&#xff0c;经过单片机处理后显示酒精浓度&a…

c++11新特性-6-using

文章目录 using1.定义别名 using 1.定义别名 1.1 定义类型别名 using t int; 1.2 定义函数指针 int test(double,string){}//返回值类型 int &#xff0c;参数类型&#xff1a;double string using func int(*) (double,string);int main() {func f test;f(10.5,“hello…

算法训练营day69

查并集&#xff1a;107. 寻找存在的路径 (kamacoder.com) #include<iostream> #include<vector>using namespace std;vector<int> father(101, 0);void init() {for(int i 1;i < 101;i) {father[i] i;} }int find(int v) {if(v father[v]) return v;e…

老年生活照护实训室:为养老服务业输送专业人才

本文探讨了老年生活照护实训室在养老服务业专业人才培养中的关键作用。通过详细阐述实训室的功能、教学实践、对学生能力的培养以及面临的挑战和解决方案&#xff0c;强调了其在提升人才素质、满足行业需求方面的重要性&#xff0c;旨在为养老服务业的可持续发展提供有力的人才…

electron教程(二)控制应用程序的事件生命周期

1.will-finish-launching 当应用程序完成基础的启动的时候被触发&#xff0c;在 Windows 和 Linux 中, will-finish-launching 事件与 ready 事件是相同的; 在 macOS 中&#xff0c;这个事件相当于 NSApplication 中的 applicationWillFinishLaunching 提示。 app.on(will-fi…

Butterfly主题文章标题改成转动小风车

效果 标题级别不同小风车颜色不同&#xff0c;鼠标移入会有转动变慢及变色效果。 新建css 建议在/source下创建诸如img/css/js等文件夹&#xff0c;存放文章或网站用的素材&#xff0c;分门别类后续也方便维护。 Hexo打包的时候&#xff0c;会自动把/source下的文件&#…

深度神经网络语言识别

「AI秘籍」系列课程&#xff1a; 人工智能应用数学基础人工智能Python基础人工智能基础核心知识人工智能BI核心知识人工智能CV核心知识 使用 DNN 和字符 n-gram 对一段文本的语言进行分类&#xff08;附 Python 代码&#xff09; 资料来源&#xff0c;flaticon&#xff1a;htt…

AI绘画如何变现赚取副业收入?保姆级AI绘画SD和MJ副业实操教程建议收藏!

hi~大家好&#xff0c;我是向阳。 今天给大家分享一下我是如何通过AI绘画赚到一点小钱的&#xff01; 副业做个人IP&#xff0c;某书&#xff0c;专注Midjourney &#xff0c;深入 AI头像制作&#xff0c;小某书做了500头像&#xff0c;变现了差不多一万元&#xff0c;每日短…

[qt][C++]object.h(448): error C2238: 意外的标记位于“;”之前

问题场景&#xff1a;此问题多发生在qt调用python.h&#xff0c;比如matplotlib-cpp等需要python引用的C库 #include <Python.h>报错 \python\python37-32\include\object.h(448): error C2059: 语法错误:“;” \python\python37-32\include\object.h(448): error C223…