FILE *fopen(const char *path, const char *mode); /**/ FILE *fdopen(int fd, const char *mode);
打开一个流
参数一:const修饰,指定的文件---打开路径名为path的一个指定的文件
参数二:const修饰,指定对该I/O流的读写方式
ps:起始位置:文件的第一个有效字符
文件尾端:文件的最后一个有效字符的下一个字符
///////////////////要求文件存在////////////////////////
r: 只读方式打开,并指向文件的起始位置。
r+:读写方式打开,并指向文件的起始位置。
//////////////////文件不存在则会创建//////////////////////////
w:写的方式打开。把文件截断是0,并指向文件的起始位置。
w+:读写方式打开。如果文件不存在则创建文件,文件存在则截断至0,并指向文件的起始位置。
a:追加写的方式打开,如果文件不存在则创建文件,并指向文件的尾端。
a+:追加读写的方式打开,如果文件不存在则创建文件。读文件->文件位置指针指向文件起始位置,写文件->文件位置指针指向文件尾端。
mode字符中可以包括字符‘b’:一种是文本流 一种是二进制流,在所有的POSIX包括linux环境 ‘b’会被忽略。
返回值:
成功返回一个文件指针,失败返回NULL,并设置errno;
errno:打开/usr/include/asm-generic/errno.h或者/usr/include/asm-generic/errno-base.h会发现errno的宏定义 现在errno已经被私有化
#include <errno.h> errno
gcc -E:以#号开头的文件都会在预处理部分加载到文件
会发现,里面没有errno的定义
(*__errno_location ())
ps:
参数用const修饰:告诉USER,函数的参数为常量指针,在使用该函数的过程中不会改变传过来的参数,以只读的方式操作参数
eg:
? "xbc" ?
这个指针指向的常量
通过指针不能改变一个常量的内容
不同编译环境结果是不一样的
linux会把常量放到常量区,所以修改不了ptr
范例:
目的:测试文件以“r”或者“r+”的方式打开一个不存在的文件,打印errno。
#include <stdio.h> #include <stdlib.h> #include <errno.h> int main(void) { FILE *fp; fp = fopen("temp","r"); if( fp == NULL) { fprintf(stderr , "fopen() failed . errno = %d\n",errno); exit(1); } exit(0); }
(未加fclose(FILE *)编译完成后,运行可执行文件发现打印信息:
fopen() failed . errno = 2
查看/usr/include/asm-generic/errno-base.h ----->errno = 2 时 是没有找到文件或者目录
#define ENOENT 2 /* No such file or directory */
查看文件出错原因,打印错误信息
1:
void perror(const char *s); // s 人为规定的串后面添加错误信息---自动关联全局变量errno
#include <stdio.h> #include <stdlib.h> #include <errno.h> int main(void) { FILE *fp; fp = fopen("temp","r"); if( fp == NULL) { //fprintf(stderr , "fopen() failed . errno = %d\n",errno); perror("fopen()"); exit(1); } exit(0); }
(未加fclose(FILE *),编译完成,运行程序,打印信息
fopen(): No such file or directory
2:
#include <string.h> char *strerror(int errnum);//
参数:errno
返回值:用来描述errno的字符串
#include <stdio.h> #include <stdlib.h> #include <errno.h> #include <string.h> int main(void) { FILE *fp; fp = fopen("temp","r"); if( fp == NULL) { //fprintf(stderr , "fopen() failed . errno = %d\n",errno); //perror("fopen()"); fprintf(stderr,"fopen():%s\n",strerror(errno)); exit(1); } exit(0); }
(未加fclose(FILE *),编译完成,运行程序,打印信息
fopen(): No such file or directory
-----------------------------fopen over----------------------------------------