二者都是文件操作,最基本的区别是:
open属于低级IO,返回一个文件描述符,没有缓冲,与read、write等配合使用;
fopen属于高级IO,返回一个文件指针,有缓冲,与fread、fwrite等配合使用。
open是UNIX系统调用,返回值是文件句柄,即文件在文件描述表中的索引。
fopen是ANSI标准中的C语言库函数,返回值是一个指向文件的指针。
低级IO运行在内核态,离内核近:高级IO运行在用户态,离内核远。open为低级IO,fopen为高级IO。这一特性决定了,open由于靠近内核,所以可移植性有限:fopen由于远离内核,是C语言标准函数,可移植性比open强。
涉及到缓冲文件系统,缓冲文件系统的原理是,在内存中开辟一个缓冲区,当执行写操作时,先将数据写入缓存区,待缓冲区满后再将数据写入文件:当执行读操作时,先将数据读入缓冲区,待缓冲区满后再将数据读入内存。缓冲区的大小由机器决定。fopen, fclose, fread, fwrite, fgetc, fgets, fputc, fputs, freopen, fseek, ftell, rewind等读写操作均用到缓冲区。
open, close, read, write, getc, getchar, putc, putchar等低级IO函数直接通过操作系统的调用来操作文件,没有使用缓冲区。它们不设置文件指针,只能二进制读写文件,因此效率很高,速度很快。但是由于ANSI标准已经不包括非缓冲文件系统,因此不推荐使用这些函数。
内核态中的设备驱动文件,是不能当作流文件打开的,因此只能使用open。