黄石市城乡建设网站,外贸网站建设经验,西安网站制作西安搜推宝,网站建设课程实训报告open#xff1a;系统调用#xff0c;返回的是文件描述符#xff0c;即文件句柄#xff0c;是文件在文件描述副表里的索引。
fopen#xff1a;C语言库函数#xff0c;返回的是一个指向文件结构的指针。fopen是ANSI C标准中的C语言库函数#xff0c;在不同的操作系统中应…open系统调用返回的是文件描述符即文件句柄是文件在文件描述副表里的索引。
fopenC语言库函数返回的是一个指向文件结构的指针。fopen是ANSI C标准中的C语言库函数在不同的操作系统中应该调用不同的内核APIUNIX环境下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等。
两者的区别
fopen 系列是标准的C库函数open系列是 POSIX 定义的是UNIX系统里的systemcall。 也就是说fopen系列更具有可移植性而open系列只能用在 POSIX 的操作系统上。使用fopen 系列函数时要定义一个指代文件的对象被称为“文件句柄”filehandler是一个结构体而open系列使用的是一个被称为“文件描述符” file descriptor的int型整数。fopen 系列是级别较高的I/O读写时使用缓冲而open系列相对低层更接近操作系统读写时没有缓冲。由于能更多地与操作系统打交道open系列可以访问更改一些fopen系列无法访问的信息如查看文件的读写权限。这些额外的功能通常因系统而异。使用fopen系列函数需要#includesdtio.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);