緩沖文件系統(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.pswp.cn/news/378910.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/378910.shtml
英文地址,請注明出處:http://en.pswp.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;…