第十三章 - DDL-Killer/The-road-of-Linxu-Group2024 GitHub Wiki

文件通信

文件是什么

  • 文件通常是在磁盘或固态硬盘上的一段已命名的存储区

文本模式和二进制模式

  • C语言提供了两种访问文件的途径:二进制和文本模式

I/O级别

  • 底层I/O使用操作系统提供的基本I/O服务
  • 标准高级I/O使用C库的标准包和stdio.h头文件定义

标准I/O

  1. 标准I/O有许多专门的函数简化了不同问题
  2. 输入和输出都是缓冲的

fopen()函数

image

fclose()函数

  • 关闭指定的文件,必要时刷新缓冲区
  • 成功关闭,返回0,否则返回EOF

文件I/O:fprintf()、scanf()、fgets()、fputs()

fprintf() fscanf()

  • 区别在于这些需要用一个参数指定待处理的文件

fgets() fputs()

  • fgets()第一个参数是储存输入位置的地址(char *),第二个参数是整数,表示待输入的字符串的大小,最后一个参数是文件指针,指定待读取的文件,fgets()在末尾加上空字符
  • fputs()第一个是字符串的地址,第二个是文件指针,填入时不补充空字符

随机访问:fseek()和ftell()

工作原理

  • fseek()第一个参数为FILE指针,第二个参数时偏移量,必须是long类型,第三个参数是模式:文件开始处、当前位置、文件末尾,返回值是0,否则-1
  • ftell()返回值long,返回当前位置

标准I/O机理

  1. 第一步用fopen打开文件
  2. 创建一个缓冲区以及一个包含文件和缓冲区数据的结构
  3. fopen返回一个指向该结构的指针

其他标准I/O函数

int ungetc(int c,FILE *fp)函数

  • 允许把c指定的字符放回输入流中

int fflush()

  • 将输入缓冲区中未写入数据被发送到fp指定的输出文件,称为刷新缓冲区

int setvbuf()

  • int setvbuf(FILE * restrict fp, char * restrict buf, int mode, size_t size);
  • mode:_IOFBF(完全缓冲),_IOLBF(行缓冲),_IONBF(无缓冲)
  • 创建了一个供标准I/O函数替换使用的缓冲区

fwrite()

  • size_t fwrite(const void* restrict ptr,size_t size,size_t nmemb,FILE * restrict fp)
  • ptr是待写入数据块的地址
  • size表示待写入数据块的大小
  • nmemb表示待写入数据块的数量
  • fp表示待写入的文件

fread()文件

  • size_t fread(void * restrict ptr,size_t size,size_t nmene,FILE * restrict fp)
  • 待输入换待读取