基于Ubuntu的Linux学习[文件目录操作]

前言(文件操作中C语言平台与类UNIX平台的区别)

用户程序在读写文件时既可以调用 C 标准 IO 库函数,也可以直接调用系统调用函数。这其中无缓冲的系统调用函数每次读写都要进入内核(执行操作系统的代码),调用一个系统调用函数比调用一个用户空间的函数要花费更长的时间,在使用基于缓冲区的 C 库函数可以开辟缓冲区,将数据组织在缓冲区中,满足一定条件时再使用系统调用函数真正写入到文件中,从而提高操作效率。

C 标准库函数是符合 ANSI C 协议的接口规范,系统调用则是符合 POSIX 接口规范的,在所有支持 C 语言的平台上都可以使用 C 标准库函数,而只有在类 UNIX 的平台上才能使用符合 POSIX 标准的系统调用函数。

1.基于缓冲区的文件操作

1.1 缓冲区介绍

读写操作都要经过一个缓冲区,满足一定条件后再进行读入和写入。

标准的输入以及输出,内部为基于缓冲区的文件操作:

  • 标准输入:stdin
  • 标准输出:stdout
  • 标准错误:stderr
  • 清理相应缓冲区:fflush();

1.2 打开关闭函数

C语言中,用FILE这个结构体,描述打开的文件的详细信息。FILE定义在stdio.h文件里面。对文件操作其实就是操作FILE里面的元素,系统封装了所有操作文件的函数。

原型:FILE *fopen(const char *path, const char *mode);

  • 参数1:路径
    • 绝对路径:相对于顶层目录的路径
    • 相对路径:当前工程下的路径
  • 参数2:打开方式
  • 返回值:打开成功后返回操作这个文件的指针,失败返回NULL

关闭函数:fclose(FILE *fp); //关闭fp指向的文件

1.3 单个字符读写操作

  • 单字符写:int fputc(int c, FILE *stream);
  • 单字符读:int fgetc(FILE *stream);
  • 判断文件指针是否到文件尾部:int feof(FILE *fp);
#include<stdio.h>

int main()
{
    FILE *fd;
    char ch;
    fd = fopen("a.txt","w+");
    while(ch != '!')
    {
        ch = getchar();
        fputc(ch,fd);
    }
    fclose(fd);
    fd = fopen("a.txt","r");
    while(!feof(fd))
    {
        ch = fgetc(fd);
        putchar(ch);
    }
    fclose(fd);
    return 0;
}

1.4 文件指针定位

  1. rewind(FILE *fp); //将读写指针定位到文件开始位置
  2. fseek(FILE *fp, long offset, int whence); //将fp指向的文件的读写指针定位到指定位置
    • 参数1:要定位的文件
    • 参数2:要偏移字符,可正可负可为0,正的向右偏,负代表向左偏
    • 参数3:参考位置,共3种,定义在stdio.h文件里面
      • SEEK_SET:起始位置
      • SEEK_END:末尾
      • SEEK_CUR:当前位置

1.5 字符串读写

写入字符串:int fputs(const char *s, FILE *stream);

  • 参数1:为写入的字符串
  • 参数2:要写入的文件
  • 返回值:返回最后一个被输出到文件流中的字符;如果没有数据输出到文件流,则返回0

读取字符串:char *fgets(char *s, int n, FILE *stream);

  • 参数1:用户定义接受读取字符串的缓冲区地址
  • 参数2:要读取的长度
  • 参数3:要读取的文件
  • 返回值:成功,返回读取的字符串;不成功,返回NULL

1.6 块读块写

块写:size_t fwrite(const void *ptr, size_t size, size_t n, FILE *stream);

  • ptr:需要写入到文件流中的数据块
  • size:数据块的组成元素的大小
  • n:数据块的元素个数
  • stream:文件流指针

块读:size_t fread(void *ptr, size_t size, size_t n, FILE *stream);

  • ptr:读取的数据的存储空间地址
  • size:每个元素的大小
  • n:读取的元素的个数
  • stream:文件流指针

1.7 格式化读写

函数原型:

int fprintf(FILE *fp, const char *format[,argument,...])
int fscanf(FILE *fp, const char *format[,address,...])

功能:按格式对文件进行读写操作。二进制的文件不要用,而改用 fread 和 fwrite。

  • fprintf:输出列表中的各项数据按指定的格式写入到 fp 指向的文件中
  • fscanf:从 fp 所指向的文件中按指定的格式读取数据依次存放到输出列表中的各项

返回值:成功,返回读写的个数;出错或文件尾,返回 EOF(-1)。

eg:

fprintf(fp, "%d,%.2f", i, t);   //将 i 和 t 按%d,%.2f 格式输出到 fp 文件
fscanf(fp, "%d,%f", &i, &t);    //若文件中有 3,4.5 ,则将 3 送入 i, 4.5 送入 t

Updated: