zoukankan      html  css  js  c++  java
  • 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
    ",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
    ",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
    ",errno);
            //perror("fopen()");
            fprintf(stderr,"fopen():%s
    ",strerror(errno));
            exit(1);
        
        }
        exit(0);
    }
    View Code

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

    fopen(): No such file or directory
  • 相关阅读:
    【转】工作流持久化的几点说明
    转:壹百度-百度十年千倍的29条法则
    CRM软件设计评测点与采集测评点
    键盘上各按键对应的ASSII值
    导入Excle数据至数据库 “外部表不是预期的格式”错误信息
    浅谈代码的执行效率(2):编译器的威力 [摘自赵劼老师的博客]
    代码的执行效率(3)缓存与局部性 摘自赵劼老师的博客
    浅谈代码的执行效率(一)
    C# Base64加解密图片
    Bulk Insert的用法
  • 原文地址:https://www.cnblogs.com/muzihuan/p/4771640.html
Copyright © 2011-2022 走看看