1.2 fopen使用

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);
}
View Code

(未加fclose(FILE *)编译完成后,运行可执行文件发现打印信息:

fopen() failed . errno = 2

查看/usr/include/asm-generic/errno-base.h   ----->errno = 2 时  是没有找到文件或者目录

#define ENOENT       2  /* No such file or directory */

查看文件出错原因,打印错误信息

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);
}
View Code

(未加fclose(FILE *),编译完成,运行程序,打印信息

fopen(): No such file or directory
#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);
}
View Code

(未加fclose(FILE *),编译完成,运行程序,打印信息

fopen(): No such file or directory

 

posted @ 2015-08-30 22:30  muzihuan  阅读(1629)  评论(0编辑  收藏  举报