Linux系统编程——标准c库对文件操作

news2024/12/28 3:01:07

Linux、标准c库对文件操作的区别

1.来源

从来源的角度看,两者能很好的区分开,这也是两者最显而易见的区别:

  • open是UNIX系统调用函数 (包括LINUX等) ,返回的是文件描述符 (File Descriptor),它是文件在文件描述符表里的索引。.·
  • fopen是ANSIC标准中的C语言库函数,在不同的系统中应该调用不同的内核api。返回的是一个指向文件结构的指针

2.移植性

  • 这一点从上面的来源就可以推断出来,‘fopen’是C标准函数,因此拥有良好的移植性,而‘open’是UNIX系统调用,移植性有限。如windows下只能运行’fopen‘,但无法运行‘open’,若想要在windows下运行‘open’,则只能在windows下相似的功能使用API函数 ‘CreateFile’。

3.适用范围

  • open返回文件描述符,而文件描述符是UNIX系统下的一个重要概念,UNIX下的一切设备都是以文件的形式操作。如网络套接字、硬件设备等。当然包括操作普通正规文件 (Regular File)。(一些特定情况下只能用open)
  • fopen是用来操纵普通正规文件 (Regular File) 的
  • 两者都能操纵普通正规文件,但通常推荐fopen

4.文件IO层次

  • 如果从文件I0的角度来看,前者属于低级I0函数,后者属于高级I0函数。低级和高级的简单区分标准是:谁离系统内核更近。低级文件IO运行在内核态,高级文件IO运行在用户态。

5.缓冲

  • 1.缓冲文件系统缓冲文件系统的特点是:在内存开辟一个"缓冲区”,为程序中的每一个文件使用,当执行读文件的操作时,从磁盘文件将数据先读入内存“缓冲区”,装满后再从内存“缓冲区”依此读出需要的数据。执行写文件的操作时,先将数据写入内存"缓冲区”,待内存“缓冲区”装满后再写入文件。由此可以看出,内存“缓冲区”的大小,影响着实际操作外存的次数,内存“缓冲区”越大,则操作外存的次数就少,执行速度就快、效率高。一般来说,文件"缓冲区”的大小随机器 而定。fopen,fclose,fread,fwrite,fgetc, fgets, fputc, fputs, freopen, fseek, ftell, rewind等
  • 2.非缓冲文件系统缓冲文件系统是借助文件结构体指针来对文件进行管理,通过文件指针来对文件进行访问,既可以读写字符、字符串、格式化数据,也可以读写二进制数据。非缓冲文件系统依赖于操作系统,通过操作系统的功能对文件进行读写,是系统级的输入输出,它不设文件结构体指针,只能读写二进制文件,但效率高、速度快,由于ANSI标准不再包括非缓冲文件系统,因此建议大家最好不要选择它。open,close,read,write, getc,getchar, putc,putchar等。
  • 一句话总结一下,就是open无缓冲,fopen有缓冲。前者与read,write等配合使用,后者与fread,fwrite等配合使用
  • 使用fopen函数,由于在用户态下就有了缓冲,因此进行文件读写操作的时候就减少了用户态和内核态的切换(切换到内核态调用还是需要调用系统调用AP:read,wite);而使用open函数,在文件读写时则每次都需要进行内核态和用户态的切换,表现为,如果顺序访问文件,fopen系列的函数要比直接调用open系列的函数快;如果随机访问文件则相反

标准c库对文件操作

1.fopen函数

可以在Linux环境下用fopen函数创建或打开一个已有的文件,其返回值是FILE类型的文件名,函数原型如下:

FILE *fopen(const char *filename, const char *mode);
const char *filename文件名
,const char *mode打开文件的权限(方式)

文件的打开方式有很多种,下面是对常用文件打开方式的汇总

方式解释
r打开一个已有的文本文件,允许读取文件,文件必须存在
r+打开一个已有的文本文件,允许读写文件,文件必须存在
w以写的方式打开文件。如果文件不存在 , 就创建文件 ; 如果文件存在 , 覆盖原有数据重新写入数据 ; 写出时 , 将该文件原有数据覆盖 , 即文件长度清 0 , 删除文件内容 , 重新写入文件内容 
w+以读写的方式打开已有的文本文件。如果文件不存在 , 就创建文件 ; 如果文件存在 , 覆盖原有数据重新写入数据 ; 写出时 , 将该文件原有数据覆盖 , 即文件长度清 0 , 删除文件内容 , 重新写入文件内容 
a以追加方式打开写文件。如果文件不存在 , 则 创建文件 ;如果文件存在 , 则新写入的数据会被 追加到文件末尾 , 文件原来的数据会被保留 
a+以追加方式打开读写文件。如果文件不存在 , 则 创建文件 ;如果文件存在 , 则新写入的数据会被 追加到文件末尾 , 文件原来的数据会被保留 

2.fclose函数

与Linux对文件操作一样,打开文件对文件进行一系列操作后,需关闭文件,则调用flose,函数原型如下:

 int fclose( FILE *fp );

参数是打开文件的返回值,与文件描述符类似

如果成功关闭文件,fclose( ) 函数返回零,如果关闭文件时发生错误,函数返回 EOF。这个函数实际上,会清空缓冲区中的数据,关闭文件,并释放用于该文件的所有内存。EOF 是一个定义在头文件 stdio.h 中的常量。

3.fwrite函数

函数原型如下:

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)
void *ptr缓冲区(内容存放的地方)
size_t size写入字节的大小
size_t nmemb写入字节的个数
FILE *stream内容输入位置(将内容传到指定位置)

4.fread函数

函数原型如下:

size_t fread(void *ptr, size_t size, sizet nmemb, FILE *stream);
void *ptr缓冲区(读取内容后内容存放的地方)
size_t size读取字节的大小
sizet nmemb读取字节的个数
FILE *stream一开始存放内容的位置(即将读取)

代码展示

#include <stdio.h>
#include <string.h>

int main()
{
    FILE *fp;
	char *buf = "Hello word";
	char readBuf[128] = {0};

	fp = fopen("Luo.text","w+");//打开Luo.text,若不存在则创建一个

	fwrite(buf,sizeof(char),strlen(buf),fp);//buf是字符串,所以只第二个参数是字符型字节大小,第三个参数是字符串长度,将buf中的内容写到fp
//	fwrite(buf,sizeof(char)*strlen(buf),1),fp);//也可以计算总的长度后,只计算1次
	fseek(fp,0,SEEK_SET);//光标移动方便读取
	
	fread(readBuf,sizeof(char),strlen(buf),fp);//将fp中的内容读取到readBuf中
//  fread(readBuf,sizeof(char)*strlen(buf),1),fp);//与上面类似

	printf("read context is %s\n",readBuf);

    return 0;
}
                     

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

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

相关文章

使用JAVA pdf转word

使用spire.pdf 非常简单。 查看 https://mvnrepository.com/artifact/e-iceblue/spire.pdf 注意&#xff0c;这个包在 e-iceblue 下。 下面开始撸代码 先来pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://mav…

机器视觉系统的组成

图像获取 光学系统采集图像&#xff0c;图像转换成模拟格式并传入计算机存储器。 图像处理和分析 处理器运用不同的算法来提高对结论有重要影响的图像要素并形成数据作为判决依据。 判决和输出 处理器的控制程序根据收到的数据做出结论并输出信息作反馈控制等应用。

DevEco Studio开发工具下载、安装(HarmonyOS开发)_For Mac

一、说明 初学HarmonyOS开发&#xff0c;DevEco Studio开发工具的安装和使用是必须的。 &#xff08;注&#xff1a;不多废话&#xff0c;跟着下面流程操作下载、安装DevEco Studio即可。&#xff09; 二、下载DevEco Studio 1.官网下载地址&#xff1a; https://developer.…

element 周选择器el-date-picker

2023.11.13今天我学习了在使用element 周选择器的时候&#xff0c;我们会发现默认的时间选择为星期日到下一个星期一&#xff0c;如图&#xff1a; 我们需要改成显示星期一到星期天&#xff0c;只需要加一行代码&#xff1a;picker-options <el-date-pickertype"week&…

R语言编写代码示例

R语言编写的爬虫程序&#xff0c;使用了requests库来发送请求&#xff0c;使用BeautifulSoup库来解析HTML。 r # 第一步&#xff0c;安装必要的库 install.packages("xml2") install.packages("requests") install.packages("httr") install.pac…

C/C++交换输出 2021年9月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析

目录 C/C交换输出 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 C/C交换输出 2021年9月 C/C编程等级考试一级编程题 一、题目要求 1、编程实现 输入两个整数a,b&#xff0c;将它们交换输出 2、输入输…

nacos适配达梦数据库

一、下载源码 源码我直接下载gitee上nacos2.2.3的&#xff0c;具体链接&#xff1a;https://gitee.com/mirrors/Nacos/tree/2.2.3&#xff0c;具体如下图&#xff1a; 二、集成达梦数据库驱动 解压源码包&#xff0c;用idea打开源码&#xff0c;等idea和maven编译完成&#xff…

【npm 错误】:npm ERR! code ERESOLVE、npm ERR! ERESOLVE could not resolve问题

用过npm的小伙伴都会有这么一个情况出现&#xff0c;就是npm install /npm install xxxx 会出现改一连串的错误&#xff0c;如下&#xff1a; 解决办法&#xff1a; 只要在npm install后面加上--legacy-peer-deps就可以解决问题,安装插件也一样 npm install --legacy-peer-dep…

【unity2021.3.6f】运行官方 Vuforia Hololens 2 Sample 教程

文章目录 前言一、创建unity项目二、导入unity1.添加到我的资源2.在package Manage 里面去找到&#xff0c;点击下载&#xff0c;下载完成后点击Import 如下图&#xff1a;3.导入途中会有窗口弹出 很多提示&#xff0c;都点击默认选项&#xff1a;Import 、Install/Upgrade 等 …

java学习part02一些特性

17-Java语言概述-Java语言的特点和JVM的功能_哔哩哔哩_bilibili 1.java优点 跨平台性 在jvm上运行 2.jvm 2.1实现跨平台性 不需要对每一种指令集编写编译器&#xff0c;只需要针对jvm编程&#xff0c;jvm会自动转换 2.2内存回收 内存溢出&#xff1a;用的内存太多已经占满了&…

uni-app的下拉搜索选择组合框

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;Vue篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家介绍uni-app中一款可以搜索下拉选择输入框的插件 下拉搜索选择组合框 superwei-combox 组合框 uni-app中可下拉搜索选…

探索STM32系列微控制器的特性和性能

STM32系列微控制器是意法半导体&#xff08;STMicroelectronics&#xff09;公司开发的一款强大的嵌入式微控制器系列。该系列微控制器以其丰富的特性和卓越的性能&#xff0c;成为了嵌入式系统开发领域的首选。本文将深入探索STM32系列微控制器的特性和性能&#xff0c;并结合…

2022年09月 Python(五级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 已知字符串:s=“语文,数学,英语”,执行print(s.split(“,”))语句后结果是?( ) A: [‘语文’, ‘数学’, ‘英语’] B: [语文, 数学, 英语] C: [‘语文, 数学, 英语’] D: [‘语…

路由器的结构以及工作原理

目录 路由器的结构 交换结构三种常用的交换方式 1.通过存储器 2.通过总线 3.通过纵横交换结构&#xff08;crossbar switch fabric&#xff09; 路由器的结构 路由器结构可划分为两大部分&#xff1a;路由选择部分&#xff0c;分组转发部分 路由选择部分也叫做控制部分&…

LeetCode(11)H 指数【数组/字符串】【中等】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 274. H 指数 1.题目 给你一个整数数组 citations &#xff0c;其中 citations[i] 表示研究者的第 i 篇论文被引用的次数。计算并返回该研究者的 h 指数。 根据维基百科上 h 指数的定义&#xff1a;h 代表“高引用次数” &a…

使用opencv实现图像的畸形矫正:仿射变换

1 仿射变换 1.1 什么是仿射变换 在图像处理中&#xff0c;经常需要对图像进行各种操作如平移、缩放、旋转、翻转等&#xff0c;这些都是图像的仿射变换。图像仿射变换又称为图像仿射映射&#xff0c;是指在几何中&#xff0c;一个向量空间进行一次线性变换并接上一个平移&…

面试:容器技术

目录 为什么需要 DevOpsDocker 是什么&#xff1f;Docker 与虚拟机有何不同&#xff1f;什么是 Docker 镜像&#xff1f;什么是 Docker 容器&#xff1f;Docker 容器有几种状态&#xff1f;解释一下 Dockerfile 的 ONBUILD 指令&#xff1f;什么是 Docker Swarm&#xff1f;如何…

SSH全能终端工具mobaXterm(远程工具)使用教程

参考文章&#xff1a;SSH全能终端工具MobaXterm Personal v23.0 完全汉化绿色版 参考文章&#xff1a;MobaXterm 23终端控制软件 文章目录 SSH全能终端工具mobaXterm使用教程目录引言mobaXterm概述安装与配置下载mobaXterm安装过程基础设置 SSH连接创建SSH会话SSH命令行操作文…

Azure 机器学习:在 Azure 机器学习中使用 Azure OpenAI 模型

目录 一、环境准备二、Azure 机器学习中的 OpenAI 模型是什么&#xff1f;三、在机器学习中访问 Azure OpenAI 模型连接到 Azure OpenAI部署 Azure OpenAI 模型 四、使用自己的训练数据微调 Azure OpenAI 模型使用工作室微调微调设置训练数据自定义微调参数部署微调的模型 使用…

线圈寿命预测 数据集讲解

来自-郭师兄 1.这个是线圈数据的阻抗、电抗等数据&#xff0c;我想根据这个个数据进行线圈寿命预测也就是RUL预测&#xff0c;请问有什么思路吗。 最简单的思路&#xff1a; 数据通过某种方法进行压缩表征到一维再通过 同时需要标签。 确定一个特征 使用降维方法如同PCA来构…