标准C库对文件的操作
一、概述:Linux文件编程中的open是UNIX系统(包括LINUX、Mac等)的系统调用函数,返回的是文件描述符(File Descriptor),他是文件在文件描述符表里的索引,区别于C语言库函数fopen。fopen是ANSI C标准中的C语言库函数,在不同的系统中应该调用不同的内核api。返回的是一个指向文件结构的指针。open是UNIX系统调用,移植性有限,而fopen是C标准函数,因此拥有良好的移植性。因为open返回的是文件描述符,而文件描述符在UNIX系统中是一个重要概念,UNIX下的一切设备都是以文件的形式操作的。而fopen是用来操控普通正规文件的。open函数离内核最近属于低级IO函数,速度快而fopen属于高级IO函数,有缓冲,速度较慢。低级文件IO运行在内核态,高级文件IO运行在用户态。前者得与read,write等函数配合使用,后者与fread,fwrite等配合使用。
二、相关函数:fopen,fwrite,fread,fclose,fputc,feof,fgetc。
三、函数fopen:
#include <stdio.h>
FILE *fopen(const char *path, const char *mode);
//返回值:成功返回指向该流的文件指针;失败返回NULL
① 功能:使用给定的模式mode打开filename所指向的文件。
② 参数:
*path:要打开的文件名称。
*mode:文件访问模式。
以 x 结尾的模式为独占模式,文件已存在或者无法创建(一般是路径不正确)都会导致 fopen 失败。文件以操作系统支持的独占模式打开。
上述的形态字符串都可以再加一个 b 字符,如 rb、w+b 或 ab+ 等组合,加入 b 字符用来告诉函数库以二进制模式打开文件。如果不加 b,表示默认加了 t,即 rt、wt,其中 t 表示以文本模式打开文件。由 fopen() 所建立的新文件会具有 S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH(0666) 权限,此文件权限也会参考umask值。
有些 C编译系统可能不完全提供所有这些功能,有的C版本不用"r+"、“w+”、“a+”,而用"rw"、“wr”、"ar"等,应注意所用系统的规定。
四、函数fwrite
#include <stdio.h>
size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
//返回值:若成功,返回一个 size_t 对象,表示元素的总数,该对象是一个整型数据类型;若失败,返回值小于nmemb的值
①功能:把ptr所指向的数组中的数据写入到给定流stream中。
②参数:
*ptr:指向要被写入的元素数组的指针。
*size:要被写入的每个元素的大小,以字节为单位。
*nmemb:元素的个数,每个元素的大小为 size 字节。
*stream:指向 FILE 对象的指针,该 FILE 对象指定了一个输出流。
五、函数fread
#include <stdio.h>
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
//返回值:若成功