C语言学习笔记—文件操作

前言

  • 文件是当今计算机系统不可或缺的部分。文件用于储存程序、文档、数据、书信、表格、图片、视频和许多其他种类的信息。作为程序员,必须会编写创建文件和从文件读写数据程序。
  • 操作文件的正确流程为:打开文件 --> 读写文件 --> 关闭文件。文件在进行读写操作之前要先打开,使用完毕要关闭。
  • 在C语言中,为了统一对各种硬件的操作,简化接口,不同的硬件设备也都被看成一个文件。对这些文件的操作,等同于对磁盘上普通文件的操作。

fopen和fclose函数 

  • fopen函数原型:

  1.  主要功能是打开文件。需要头文件:stdio.h
  2. 函数声明如下:
    FILE *fopen(const char *filename, const char *mode); //使用给定的模式 mode 打开 filename 所指向的文件
  3. filename指要打开的文件名称(可包含相对路径和绝对路径),mode指文件的访问模式。模式如下表:
    模式                                                                                          描述
       r                                                            打开一个用于读取的文件。该文件必须存在
      r+                                                打开一个用于更新的文件,可读取也可写入。该文件必须存在
     rb+                                                   读写打开一个二进制文件,允许读写数据。文件必须存在
     rw+                                                                  读写打开一个文本文件,允许读和写
      w   创建一个用于写入的空文件。如果文件名称与已存在的文件相同,则会删除已有文件的内容,文件被视为一个新的空文件
      w+   创建一个用于读写的空文件。如果文件名称与已存在的文件相同,则会删除已有文件的内容,文件被视为一个新的空文件
      a                      追加到一个文件。如果文件存在,写操作向文件末尾追加数据。如果文件不存在,则创建文件
      a+            以附加方式打开可读写的文件。如果文件存在,写操作向文件末尾追加数据。如果文件不存在,则创建文件
  4. fopen打开文件成功,返回有效FILE的有效地址,失败返回NULL。
  • fclose函数:

  1. 文件一旦使用完毕,应该用 fclose() 函数把文件关闭,以释放相关资源,避免数据丢失。fclose() 的用法如下:
    int fclose(FILE *stream);   //关闭流 stream,刷新所有的缓冲区
  2. 如果流成功关闭,则该方法返回零。如果失败,则返回 EOF。
  3. 例子:
    #include <stdio.h>
    
    int main()
    {
       FILE *fp;
       fp = fopen("file.txt", "r");
       fprintf("打开一个只读文件file.txt");
       fclose(fp); 
       return(0);
    }

文本模式和二进制模式

  •  文本文件和二进制文件:

  1. 所有文件的内容都以二进制形式(0或1)储存的。
  2. 文本文件:如果文件最初使用二进制编码的字符(如ASCII或Unicode)表示文本(就像C字符串那样),该文件就是文本文件,其中包含文本内容。
  3. 二进制文件:如果文件中的二进制代表机器语言代码或数值数据(使用相同的内部表示,假设,用于long或double类型的值)或图片或音乐编码,该文件就是二进制文件,其中包含二进制内容。
  • 文本模式和二进制模式:

  1. 在二进制模式中,程序可以访问文件的每个字节。而在文本模式中,程序所见的内容和文件的实际内容不同。
  2. 在windows系统中,文本模式下,文件以" \r\n "代表换行。若以文本模式打开文件,并用fput等函数写入换行符" \n "时,函数会自动在" \n "前面加上" \r "。在windows读写一个二进制文件时,读写模式中参数一定要加" b ",防止系统添加无谓的" \r ",但读写一个文本文件时,就不要加" b ",这样可以不用单独处理" \r "。
  3.   在类Unix/Linux系统中,文本模式下,文件以" \n "代表换行,所以linux系统中在文本模式和二进制模式下并无区别。linux下读写模式中参数" b "是无效的,可忽略。

getc和putc函数

  • getc函数原型:

  1.  

stat函数

  •  函数原型:

  1. 主要获得文件属性。需要头文件:sys/types.h, sys/stat.h, unistd.h。
  2. 函数声明如下:
    int stat(const char *file_name, struct stat *buf ); // 通过文件名filename获取文件信息,并保存在buf所指的结构体stat中
  3. 执行成功则返回0,失败返回-1,错误代码存于errno,包括:
    ENOENT         参数file_name指定的文件不存在
    ENOTDIR        路径中的目录存在但却非真正的目
    ELOOP          欲打开的文件有过多符号连接问题,上限为16符号连接
    EFAULT         参数buf为无效指针,指向无法存在的内存空间
    EACCESS        存取文件时被拒绝
    ENOMEM         核心内存不足
    ENAMETOOLONG   参数file_name的路径名称太长数值
  4. stat结构体里面成员信息:
    struct stat {
        dev_t         st_dev;       //文件的设备编号
        ino_t         st_ino;       //节点
        mode_t        st_mode;      //文件的类型和存取的权限
        nlink_t       st_nlink;     //连到该文件的硬连接数目,刚建立的文件值为1
        uid_t         st_uid;       //用户ID
        gid_t         st_gid;       //组ID
        dev_t         st_rdev;      //(设备类型)若此文件为设备文件,则为其设备编号
        off_t         st_size;      //文件字节数(文件大小)
        unsigned long st_blksize;   //块大小(文件系统的I/O 缓冲区大小)
        unsigned long st_blocks;    //块数
        time_t        st_atime;     //最后一次访问时间
        time_t        st_mtime;     //最后一次修改时间
        time_t        st_ctime;     //最后一次改变时间(指属性)
  5. 例子:
    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <unistd.h>
    
    int main()
    {
        struct stat st = { 0 };
        stat("a.txt", &st);
        int size = st.st_size; // 得到文件的大小
        printf("%d\n", size);
        return 0;
    }
  • stat,fstat,lstat函数区别:

  1. fstat,lstat函数原型:
    int fstat(int filedes, struct stat *buf);
    int lstat(const char *path, struct stat *buf);
  2. 这三个函数的功能是一致的,都用于获取文件相关信息,但应用于不同的文件对象。对于stat函数中给出pathname参数,stat函数返回与此命名文件有关的信息结构,fstat函数获取已在描述符fields上打开文件的有关信息,lstat函数类似于stat,但是当命名的文件是一个符号链接时,lstat返回该符号链接的有关信息,而不是由该符号链接引用文件的信息。

fread和fwrite函数

  •  

猜你喜欢

转载自blog.csdn.net/qq_34935373/article/details/88884931