文章目錄

  • 一、int open(constchar* pathname,int flags)
  • 二、FILE * fopen(const char * path, const char * mode)
  • 三、總結
  • 參考:

一、int open(constchar* pathname,int flags)

open是UNIX系統(包括LINUX、Mac等)的系統調用函數,區別於C語言庫函數fopen。

頭文件

#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
 
int open(constchar* pathname,int flags);
int open(constchar* pathname,int flags,mode_t mode);
  • pathname:文件路徑,若有多級目錄則先建目錄
  • flags:以下選項三選一
    - O_RDONLY只讀模式
    - O_WRONLY只寫模式
    - O_RDWR讀寫模式

可選:

  • O_APPEND每次寫操作都寫入文件的末尾
  • O_CREAT如果指定文件不存在,則創建這個文件
  • O_EXCL如果要創建的文件已存在,則返回-1,並且修改errno的值
  • O_TRUNC如果文件存在,並且以只寫/讀寫方式打開,則清空文件全部內容(即將其長度截短為0)
  • O_NOCTTY如果路徑名指向終端設備,不要把這個設備用作控制終端。
  • O_NONBLOCK如果路徑名指向FIFO/塊文件/字符文件,則把文件的打開和後繼I/O
  • mode:
    生成文件權限,chmod 666 log

相關函數

close(fd);
write(int fd,char * buf,size_t size);
read(int fd,char * buf,size_t size);

使用範例:

char path[]="log";
int flags=O_RDWR|O_CREAT;
flags|=O_APPEND;
int fd_open;
int ret;
 
if((fd_open=open(path,flags,0666))<0)
	printf("open error\n");
if((ret=write(fd_open,"hello",6))<0)
	printf("write error\n");
else
	printf("write,%d\n",ret);
close(fd_open);

二、FILE * fopen(const char * path, const char * mode)

C 語言標準庫, 帶緩衝區
頭文件

#include <stdio.h>
FILE * fopen(const char * path, const char * mode);

相關函數:

fclose(fp);
size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream);
size_t fread ( void *buffer, size_t size, size_t count, FILE *stream);

使用範例:

FILE *fp=NULL;
if((fp=fopen("flog","a+"))==NULL)
{
	perror("fopen error\n");
}
char buf[]="hello";
fwrite(buf,5,1,fp);
fclose(fp);

三、總結

1、fopen為c標準庫函數,open是 POSIX 定義的,是UNIX系統裏的system call。
2、使用fopen 系列函數時要定義一個指代文件的對象,被稱為“文件句柄”(file handler),是一個結構體;而open系列使用的是一個被稱為“文件描述符” (file descriptor)的int型整數;
3、fopen 系列是級別較高的I/O,讀寫時使用緩衝;而open系列相對低層,更接近操作系統,讀寫時沒有緩衝。由於能更多地與操作系統打交道,open系列可以訪問更改一些fopen系列無法訪問的信息,如查看文件的讀寫權限。這些額外的功能通常因系統而異。
4、使用場景:應用場合下使用fopen系列函數;調用底層ioctl接口等使用open系列。

參考:

fopen /open區別linux下用c語言文件操作open和fopen