缓冲文件系统(fopen/fread/fwrite)和非缓冲文件系统(open/read/write)

open:系统调用,返回的是文件描述符,即文件句柄,是文件在文件描述副表里的索引。

fopen:C语言库函数,返回的是一个指向文件结构的指针。fopen是ANSI C标准中的C语言库函数,在不同的操作系统中应该调用不同的内核API,UNIX环境下,fopen是对open的封装。

文件描述符是UNIX/Linux下的一个概念,Linux环境下,一切设备皆是文件,一切设备皆是以文件的形式进行操作,如网络套接字、硬件设备等。

设备文件不可以当成流式文件来处理,因此,只能使用open,而fopen只是用来操纵正规文件的,并且设置有缓冲,跟open还是有区别的。

open和fopen的区别在于:

1.缓冲文件系统

缓冲文件系统是借助于文件结构体指针FILE *来对文件进行管理,通过文件指针对文件进行访问,即可以读写字符、字符串、格式化数据,也可以读写二进制数据。

缓 冲文件系统特点:在内存中开辟一个“缓冲区”,为程序里每一个文件使用,当执行读文件操作时,从磁盘文件将数据先读入内存“缓冲区”,装满后再从内存“缓冲区”依次读入接收的变量。执行写文件操作时,也是先将数据写入内存“缓冲区”,待内存“缓冲区”装满后再写入文件。由此可以看出,内存“缓冲区”的大 小,影响着实际操作外在的次数,内存“缓冲区”越大,则操作外存的次数就越少,执行速度就越快,效率就越高。一般来说,文件“缓冲区”的大小跟机器是相关的。

缓冲文件系统的IO函数主要包括:fopen, fclose, fread, fwrite, fgetc,fgets, fputc, fputs, freopen, fseek, ftell, rewind等。

2.非缓冲文件系统

非缓冲文件系统依赖于操作系统,通过操作系统的功能对文件进行读写,是系统级的输入输出,它不设文件结构体指针,只能读写二进制文件(对于UNIX系统内核而言,文本文件和二进制代码文件并无区别),但效率高、速度快,由于ANSI标准不再包括非缓冲文件系统,因此,在读取正规的文件时,建议大家最好不要选择它。

非缓冲文件系统的IO函数主要包括:open, close, read, write, getc,getchar, putc, putchar等。

两者的区别:

  1. fopen 系列是标准的C库函数;open系列是 POSIX 定义的,是UNIX系统里的systemcall。
    也就是说,fopen系列更具有可移植性;而open系列只能用在 POSIX 的操作系统上。
  2. 使用fopen 系列函数时要定义一个指代文件的对象,被称为“文件句柄”(filehandler),是一个结构体;而open系列使用的是一个被称为“文件描述符” (file descriptor)的int型整数。
  3. fopen 系列是级别较高的I/O,读写时使用缓冲;而open系列相对低层,更接近操作系统,读写时没有缓冲。由于能更多地与操作系统打交道,open系列可以访问更改一些fopen系列无法访问的信息,如查看文件的读写权限。这些额外的功能通常因系统而异。
  4. 使用fopen系列函数需要"#include<sdtio.h>";使用open系列函数需要"#include <fcntl.h>" ,链接时要之用libc(-lc)
    小结:
    总的来说,为了使程序获得更好的可移植性,未到非得使用一些fopen系列无法实现的功能的情况下,fopen系列是首选。

函数原型:

FILE fopen(constchar filename,constchar* mode );
filename 是字符串,用来命名文件,mode 为访问模式的值

int fclose( FILE *fp );
如果成功关闭文件,fclose( ) 函数返回零,如果关闭文件时发生错误,函数返回 EOF。

size_t fread(void *ptr, size_tsize_of_elements, size_tnumber_of_elements, FILE *a_file);

size_t fwrite(constvoid *ptr, size_tsize_of_elements, size_tnumber_of_elements, FILE *a_file);

文件描述符和文件指针的区别

文件描述符就是open文件时产生的一个整数,一般用fd表示,其实就是一个索引,在UNIX系统中,用来标识文件。

文件指针是是一个指向FILE的结构体,在这个结构体当中,文件描述符是它的元素之一。它用于ANSI C标准的IO库调用中,用来标识文件。

因为FILE结构体中包含了文件描述符,所以我们在调用open() 打开一个文件的时候,会通过来这个open来获得文件描述符fd。

对于一个文件来说,它的文件描述符是唯一的,但是它的文件指针却不是唯一的,只是这些指针指向的对象是唯一的,也就是这个文件。

FILE *中除了包含了fd信息,还包含了IO缓冲,所以可以理解为FILE是对fd的封装,是C标准形式,所以FILE *比fd更适合跨平台,一般情况下优先选择fopen。

C语言文件指针与文件描述符之间可以相互转换:

int fileno(FILE *stream);

FILE *fdopen(int fd, const char *mode);

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

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

相关文章

java 继承示例_Java中的继承类型以及示例

java 继承示例Prerequisite: Inheritance and its implementation in Java 先决条件&#xff1a; 继承及其在Java中的实现 Java中的继承类型 (Type of inheritance in Java) In Java programming, there are following types of the inheritances, 在Java编程中&#xff0c;有…

基于HtmlParser的网络爬虫

一、 目标 获取网页中的超链接及链接名&#xff0c;如从http://www.hao123.com/开始&#xff0c;抓取所有hao123链接到的超链接&#xff0c;再以获取到的链接网页为目标&#xff0c;获取它所链接到的网页。 二、环境及开发工具 环境&#xff1a;Java 工具&#xff1a;MyEclip…

VMware下Ubuntu无法全屏显示问题

一、运行Ubuntu的时候无法全屏显示&#xff0c;如图所示下载VMware Tools 二、之后将下载的文件拷贝到home文件夹下 三、解压该压缩包 由于该压缩包是.tar.gz结尾的故压缩命令&#xff1a;tar -zxvf VMwareTools-10.2.5-8068393.tar.gz&#xff0c;当然各版本有可能不一样&am…

AMQP RabbitMQ

转载&#xff1a;http://blog.ftofficer.com/2010/03/translation-rabbitmq-python-rabbits-and-warrens/官方介绍&#xff1a;http://www.rabbitmq.com/erlang-client-user-guide.html开始吧AMQP当中有四个概念非常重要&#xff1a;虚拟主机&#xff08;virtual host&#xff…

fsync与fflush的关系和区别

read/write/fsync与fread/fwrite/fflush的关系和区别 read/write/fsync&#xff1a; linux底层操作&#xff1b; 内核调用&#xff0c; 涉及到进程上下文的切换&#xff0c;即用户态到核心态的转换&#xff0c;这是个比较消耗性能的操作。 fread/fwrite/fflush&#xff1a;…

lumanager mysql密码_LuManager单独安装mysqli

首先确定你正在使用的php版本以及php.ini的位置&#xff0c;LuManager自带了几个版本。如果是默认安装&#xff0c;应该是5.2.17。php.ini的位置应该是在/usr/local/php_fcgi/lib/php.ini要确定这些信息&#xff0c;可以自己编写一个 info.phpphpinfo();?>把文件存放到网站…

数据库系统数据库管理系统_数据库管理系统介绍

数据库系统数据库管理系统数据库 (Database) A database is a collection of related data. In database any user can efficiently access the data which users want to retrieve. It can be anything from a simple collection of roll numbers, names, addresses and phone…

vba将select的值直接赋给变量

strSql ""strSql strSql & " select max(number) from dbo.#DATA" & vbCrLfrss.Open strSql, cnn numb rss.Fields(0)rss.Close转载于:https://www.cnblogs.com/zigewb/archive/2013/02/06/2900645.html

set_exception_handler 自定义异常处理

刚才已经说过了set_error_handler这个函数&#xff0c;作用就是自定义错误处理&#xff0c; 那么现在就来简单的说一下set_exception_handler&#xff0c;看名字我们就能发现&#xff0c;这说的是自定义异常处理。 呵呵&#xff0c;我聪明吧&#xff1f;来&#xff0c;先看一下…

如何获取ubuntu源码包里面的源码进行编译

如何获取ubuntu源码包里面的源码进行编译 1、在获取源码包之前&#xff0c;确保在软件源配置文件 /etc/apt/sources.list中添加了deb-src项 2、使用如下命令获取xxx源码包的详细信息: sudo apt-cache showsrc xxx 这用来查询当前镜像站点中是否有该源码包。 3、源码包中通常…

python 示例_带有示例的Python字典popitem()方法

python 示例字典popitem()方法 (Dictionary popitem() Method) popitem() method is used to remove random/last inserted item from the dictionary. popitem()方法用于从字典中删除随机/最后插入的项目。 Before the Python version 3.7, it removes random item and from …

优化算法的意义,之二。

前一篇分析了求质数的两个算法&#xff0c;在代码执行效率和系统开销两方面进行了比较。 这在通信系统的设计和实现中&#xff0c;是非常重要的两点。因为需要同时面对的是巨大的用户群&#xff0c;和复杂的业务应用&#xff0c;通信系统的设计经常要面临鱼与熊掌间的选择。 用…

srs配置文件分析

配置文件中的每一项都是一个SrsConfDirective对象。 例子&#xff1a;vhost 1、 整个vhost 是一个SrsConfDirective对象。 1.1、名字&#xff1a;std::string name vhost 1.2、参数&#xff1a;std::vectorstd::string args第0个值 defaultVhost 1.3、子SrsConfDirective&a…

寄存器(CPU工作原理)03 - 零基础入门学习汇编语言08

第二章&#xff1a;寄存器&#xff08;CPU工作原理&#xff09;03 让编程改变世界 Change the world by program 物理地址 CPU访问内存单元时要给出内存单元的地址。所有的内存单元构成的存储空间是一个一维的线性空间。 我们将这个唯一的地址称为物理地址。 16位结构的CPU…

判别Linux是CentOs还是Ubuntu的最简单方法

在终端执行以下两条命令即可 CentOs&#xff1a;yum -help Ubuntu&#xff1a;apt-get -help

threadgroup_Java ThreadGroup toString()方法与示例

threadgroupThreadGroup类的toString()方法 (ThreadGroup Class toString() method) toString() method is available in java.lang package. toString()方法在java.lang包中可用。 toString() method is used to returns string denotation of this thread group (i.e. this m…

240多个jQuery插件

文件上传(File upload)Ajax File Upload.jQUploader.Multiple File Upload plugin. jQuery File Style.Styling an input type file.Progress Bar Plugin.表单验证(Form Validation)jQuery Validation.Auto Help.Simple jQuery form validation.jQuery XAV - form validations…

解压缩命令

.Tar.gz 解压&#xff1a;Tar zxvf FileName.Tar.gz 压缩&#xff1a;Tar zcvf FileName.Tar.gz DirName 大致总结了一下Linux下各种格式的压缩包的压缩、解压方法。但是部分方法我没有用到&#xff0c;也就不全&#xff0c;希望大家帮我补充&#xff0c;我将随时修改完善&…

Anaconda下安装OpenCV和Tensorflow(最简洁高效的方法)

安装Tensorflow 1&#xff0c;打开Anaconda Navigator 2&#xff0c;手动创建tensorflow环境&#xff0c;这个和你的python版本号一致哈&#xff08;方法一第一步之后&#xff0c;输入python即可查看当前的版本&#xff09; 3&#xff0c;手动搜索并下载添加 4&#xff0c;…