FILE *fopen(const char *path, const char *mode); FILE *fdopen(int fd, const char *mode);
打开一个流
参数一:const char *path:常量指针。const修饰,指定的文件名---打开路径名为path的一个指定的文件。
参数二:const char *mode:常量指针。const修饰,指定对该I/O流的读写方式。
返回值:FILE *:结构体指针。成功返回FILE指针,失败返回NULL并且设置errno。
****查看errno:vim /usr/include/asm-generic/errno-base.h。errno是一个宏
ps:起始位置:文件的第一个有效字符
文件尾端:文件的最后一个有效字符的下一个字符
///////////////////要求文件存在////////////////////////
r: 只读方式打开,并指向文件的起始位置。
r+:读写方式打开,并指向文件的起始位置。
//////////////////文件不存在则会创建//////////////////////////
w:写的方式打开。把文件截断是0,并指向文件的起始位置。
w+:读写方式打开。如果文件不存在则创建文件,文件存在则截断至0,并指向文件的起始位置。
a:追加写的方式打开,如果文件不存在则创建文件,并指向文件的尾端。
a+:追加读写的方式打开,如果文件不存在则创建文件。读文件->文件位置指针指向文件起始位置,写文件->文件位置指针指向文件尾端。
mode字符中可以包括字符‘b’:一种是文本流 一种是二进制流,在所有的POSIX包括linux环境 ‘b’会被忽略。
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); }