1. 程式人生 > >open和fopen的區別詳解

open和fopen的區別詳解

open和fopen的區別:

1.緩衝檔案系統
緩衝檔案系統的特點是:在記憶體開闢一個“緩衝區”,為程式中的每一個檔案使用,當執行讀檔案的操作時,從磁碟檔案將資料先讀入記憶體“緩衝區”, 裝滿後再從記憶體“緩衝區”依此讀入接收的變數。執行寫檔案的操作時,先將資料寫入記憶體“緩衝區”,待記憶體“緩衝區”裝滿後再寫入檔案。由此可以看出,記憶體 “緩衝區”的大小,影響著實際操作外存的次數,記憶體“緩衝區”越大,則操作外存的次數就少,執行速度就快、效率高。一般來說,檔案“緩衝區”的大小隨機器 而定。
fopen, fclose, fread, fwrite, fgetc, fgets, fputc, fputs, freopen, fseek, ftell, rewind等

部分函式定義:

 int fputc(int ch, FILE *stream);
 int fgetc(FILE *stream);
 int fseek(FILE *stream, long offset, int fromwhere);

2.非緩衝檔案系統
緩衝檔案系統是藉助檔案結構體指標來對檔案進行管理,通過檔案指標來對檔案進行訪問,既可以讀寫字元、字串、格式化資料,也可以讀寫二進位制數 據。非緩衝檔案系統依賴於作業系統,通過作業系統的功能對檔案進行讀寫,是系統級的輸入輸出,它不設檔案結構體指標,只能讀寫二進位制檔案,但效率高、速度 快,由於ANSI標準不再包括非緩衝檔案系統,因此建議大家最好不要選擇它。本書只作簡單介紹。open, close, read, write, getc, getchar, putc, putchar 等。

open 是系統呼叫 返回的是檔案控制代碼,檔案的控制代碼是檔案在檔案描述副表裡的索引,fopen是C的庫函式,返回的是一個指向檔案結構的指標。

fopen是ANSIC標準中的C語言庫函式,在不同的系統中應該呼叫不同的核心api
linux中的系統函式是open,fopen是其封裝函式,個人觀點。僅供參考。

檔案描述符是linux下的一個概念,linux下的一切裝置都是以檔案的形式操作.如網路套接字、硬體裝置等。當然包括操作檔案。
fopen是標準c函式。返回檔案流而不是linux下檔案控制代碼。

裝置檔案不可以當成流式檔案來用,只能用open
fopen是用來操縱正規檔案的,並且設有緩衝的,跟open還是有一些區別

一般用fopen開啟普通檔案,用open開啟裝置檔案

fopen是標準c裡的,而open是linux的系統呼叫.
他們的層次不同.
fopen可移植,open不能

fopen和open最主要的區別是fopen在使用者態下就有了快取,在進行read和write的時候減少了使用者態和核心態的切換,而open則每次都需要進行核心態和使用者態的切換;表現為,如果順序訪問檔案,fopen系列的函式要比直接呼叫open系列快;如果隨機訪問檔案open要比fopen快。

前者屬於低階IO,後者是高階IO。
前者返回一個檔案描述符(使用者程式區的),後者返回一個檔案指標。
前者無緩衝,後者有緩衝。
前者與 read, write 等配合使用, 後者與 fread, fwrite等配合使用。

用法舉例:

函式名: fopen
功 能: 開啟一個流
用 法: FILE *fopen(char *filename, char *type);
程式例:


#include <stdlib.h> 
#include <stdio.h> 
#include <dir.h>

int main(void) 
{ 
    char *s; 
    char drive[MAXDRIVE]; 
    char dir[MAXDIR]; 
    char file[MAXFILE]; 
    char ext[MAXEXT]; 
    int flags;

    s=getenv("COMSPEC"); /* get the comspec environment parameter */ 
    flags=fnsplit(s,drive,dir,file,ext);

    printf("Command processor info:\n"); 
    if(flags & DRIVE) 
       printf("\tdrive: %s\n",drive); 
    if(flags & DIRECTORY) 
       printf("\tdirectory: %s\n",dir); 
    if(flags & FILENAME) 
       printf("\tfile: %s\n",file); 
    if(flags & EXTENSION) 
       printf("\textension: %s\n",ext);

    return 0; 
} 

函式名: open
功 能: 開啟一個檔案用於讀或寫
用 法: int open(char *pathname, int access[, int permiss]);
程式例:

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

int main(void) 
{ 
   int handle; 
   char msg[] = "Hello world";

   if ((handle = open("TEST.$$$", O_CREAT | O_TEXT)) == -1) 
   { 
      perror("Error:"); 
      return 1; 
   } 
   write(handle, msg, strlen(msg)); 
   close(handle); 
   return 0; 
}

PS:

  • fopen 系列是標準的C庫函式;open系列是 POSIX 定義的,是UNIX系統裡的system call。

    也就是說,fopen系列更具有可移植性;而open系列只能用在 POSIX 的作業系統上。

  • 使用fopen 系列函式時要定義一個指代檔案的物件,被稱為“檔案控制代碼”(file
    handler),是一個結構體;而open系列使用的是一個被稱為“檔案描述符” (file descriptor)的int型整數。
  • fopen
    系列是級別較高的I/O,讀寫時使用緩衝;而open系列相對低層,更接近作業系統,讀寫時沒有緩衝。由於能更多地與作業系統打交道,open系列可以訪問更改一些fopen系列無法訪問的資訊,如檢視檔案的讀寫許可權。這些額外的功能通常因系統而異。
  • 使用fopen系列函式需要”#include