linux下C语言编程:open和fopen的差别

文章目录

    • 一、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
#include
#include
 
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 
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

你可能感兴趣的:(嵌入式开发,linux,c语言)