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

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.mfbz.cn/a/142261.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

腾讯云5年云服务器还有吗?腾讯云5年时长服务器入口在哪?

如果你是一名企业家或者是一个热衷于数字化转型的创业者&#xff0c;那么腾讯云最近推出的一项优惠活动绝对不会让你无动于衷。现在&#xff0c;腾讯云正在大力推广一项5年特价云服务器活动&#xff0c;只需要花费3879元&#xff0c;你就可以享受到腾讯云提供的优质服务。 腾讯…

RK3568平台开发系列讲解(Linux系统篇)Linux内核定时器详解

🚀返回专栏总目录 文章目录 一、系统节拍率二、内核定时器简介三、内核定时器API四、延时函数沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 Linux 内核中有大量的函数需要时间管理,比如周期性的调度程序、延时程序、对于我们驱动编写者来说最常用的定时器。硬件定…

Direct3D拾取

假设在屏幕上单击,击中的位置为点s=(x,y)。由图可以看出,用户选中了茶壶。但是仅给出点s,应用程序还无法立即判断出茶壶是否被选中。所以针对这类问题,我们需要采用一项称为“拾 取(Picking)”的技术。 茶壶和屏幕点s之间的一种联系是茶壶被投影到了一个包含了s的区域中。…

【QT系列教程】之一安装配置

文章目录 一、qt简介二、qt下载2.1、官网地址&#xff1a;https://www.qt.io/2.2、下载2.3、https://download.qt.io/official_releases/online_installers/ 三、qt安装3.1、登录账号&#xff0c;没有账号自己注册3.2、我是个人安装&#xff0c;如果是公司填写公司名字3.3、欢迎…

文件批量重命名001开始,怎么操作?

如何让文件批量重命名001开始&#xff1f;对于那些需要批量重命名文件的用户来说&#xff0c;这项任务可能涉及到整理照片、音乐文件或者调整电子文档的命名&#xff0c;而这些工作都可能会相当繁琐。有时候&#xff0c;我们希望以数字顺序名称从"001"开始批量修改文…

hadoop 虚拟机配置大数据环境 hadoop(二)

1. 安装epel-release 注:Extra Packages for Enterprise Linux 是为“红帽系”的操作系统提供额外的软件包,适用于RHEL、CentOS 和Scientific Liux。相当于是一个软件仓库&#xff0c;大多数rpm 包在官方repository 中是找不到的) 命令&#xff1a; yum install -y epel-relea…

LCD1602设计(2)-指令宏定义完整版

本文为博主 日月同辉&#xff0c;与我共生&#xff0c;csdn原创首发。希望看完后能对你有所帮助&#xff0c;不足之处请指正&#xff01;一起交流学习&#xff0c;共同进步&#xff01; > 发布人&#xff1a;日月同辉,与我共生_单片机-CSDN博客 > 欢迎你为独创博主日月同…

swagger精度丢失,postman调用正常,dameng数据库,long类型字段

问题出现 我们目前在迁移环境&#xff0c;然后往另带一个公司提供的框架里面迁移&#xff0c;然后就出现了很多问题&#xff0c;一个问题是我们返回的某个列表数据&#xff0c;在使用postman 的时候调用正常&#xff0c;但是当前端在制作页面的时候出现问题&#xff0c;并且sw…

8年经验之谈 —— 记一次接口压力测试与性能调优!

经验总结 1. 如果总的CPU占用率偏高&#xff0c;且基本都被业务线程占用时&#xff0c;CPU占用率过高的原因跟JVM参数大小没有直接关系&#xff0c;而跟具体的业务逻辑有关。 2. 当设置JVM堆内存偏小时&#xff0c;GC频繁会导致业务线程停顿增多&#xff0c;TPS下降&#xff…

P6入门:项目初始化5-项目支出计划Spending Plan

前言 使用项目详细信息查看和编辑有关所选项目的详细信息&#xff0c;在项目创建完成后&#xff0c;初始化项目是一项非常重要的工作&#xff0c;涉及需要设置的内容包括项目名&#xff0c;ID,责任人&#xff0c;日历&#xff0c;预算&#xff0c;资金&#xff0c;分类码等等&…

JAVA弑神大阵之装饰者大阵

架构说明 构成简述&#xff1a; 总接口&#xff1a; 装饰者跟被装饰者都要来实现他&#xff08;或者理解成父接口&#xff09;&#xff0c;作用&#xff1a;对被装饰者做转换 被装饰者&#xff1a; 此处实现总接口。什么都不需要动&#xff0c;他只是被增强的功能&#xff0…

Python 框架学习 Django篇 (十) Redis 缓存

开发服务器系统的时候&#xff0c;程序的性能是至关重要的。经过我们前面框架的学习&#xff0c;得知一个请求的处理基本分为接受http请求、数据库处理、返回json数据&#xff0c;而这3个部分中就属链接数据库请求的响应速度最慢&#xff0c;因为数据库操作涉及到数据库服务处理…

算法笔记-贪心1

算法笔记-贪心 什么是贪心算法分配饼干例题理解二分割字符串最优装箱整数配对最大组合整数分配区间问题买股票的最佳时机区间选点 问题什么是贪心算法 分配饼干例题 //贪心算法 //保证局部最优,从而使最后得到的结果是全局最优的 #include<iostream> #include<a…

微前端时代:打造高效、灵活的前端开发体系

❝ 本篇文章全文约 1.5 万字&#xff0c;目的是系统化地介绍微前端及其核心技术&#xff0c;并介绍了什么是微前端以及为什么我们需要它。我们还讨论了在众多微前端框架中如何选择适合自己系统的框架&#xff0c;并分享了一些业界使用微前端的实践案例。最后&#xff0c;我们提…

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

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

注册并实名认证华为开发者账号流程

文 | Promise Sun 1. 打开华为开发者网址&#xff1a; https://www.harmonyos.com 2.注册华为开发者账号&#xff1a; 1&#xff09;注册时可以选择手机号或者邮箱两种方式注册&#xff0c;建议选择手机号注册。 2&#xff09;根据提示填写信息注册即可。 3.开发者实名认证&am…

STM32与RTOS的整合:实时操作系统在嵌入式开发中的应用

随着各种嵌入式系统应用的日益复杂和对实时性要求的提高&#xff0c;使用实时操作系统&#xff08;RTOS&#xff09;成为嵌入式开发中的一种重要选择。STM32微控制器作为一种强大的嵌入式处理器&#xff0c;与各种RTOS相结合&#xff0c;能够提供更高效、可靠并且易于维护的系统…

nodejs+vue+python+PHP+微信小程序-安卓-房产中介管理信息系统的设计与实现-计算机毕业设计

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…

(只需三步)Vmvare tools安装教程,实现与windows互通复制粘贴与文件拖拽

首先确保Ubuntu是联网的&#xff0c;如果连不上网可以参考我的这个联网教程&#xff0c;也很简单 &#xff08;只需三步&#xff09;虚拟机上vm的ubuntu不能联上网怎么办-CSDN博客 第一步&#xff1a;卸载之前的tools,确保没有残留 sudo apt-get autoremove open-vm-tools 第…

多态

文章目录 多态概述多态的实现多态的特点多态的转型重写什么是重写重写示例 重载和重写的区别 面向对象三大特性&#xff1a;封装、继承、多态。 封装隐藏了类的内部实现机制&#xff0c;可以在不影响使用的情况下改变类的内部结构&#xff0c;同时也保护了数据。对外界而已它的…
最新文章