标准IO常用函数接口

本文归纳整理了常用的标准IO常见的函数接口及其用法,以供读者查阅

打开文件

fopen

image
注:

  • 使用fopen打开文件时,光标会位于文件的开头,当需要对文件进展二进制打开的时候,可以追加选项“b”。
  • FILE类型其实是一个结构体数据类型,它包含了标准 I/O 库函数为管理文件所需要的所有信息,比如包括用于实际I/O 的文件描述符、指向文件缓冲区的指针、缓冲区的长度、当前缓冲区中的字节数以及出错标志等。头文件stdio.h中有关于FILE类型的相关描述,FILE结构体类型中有一个成员是FILE类型的指针变量chain,该指针可以指向下一个被打开文件的文件信息区,也就是可以把FILE类型当做数据结构中的链表的结点,结点中除了可以存储数据域之外,还可以利用指针域存储下一个结点的地址。
  • 简单理解:用户可以在一个程序中利用fopen函数打开多个文件,每次打开一个文件,内核就会从堆内存中申请一块FILE结构体大小的空间用来存储文件的所有信息,然后按照文件打开的顺序把每个打开的文件的结构体形成一条链表,然后使用链表头进行管理。
  • 注意:打开文件的目的无非就是对文件进行读写操作,所以每次当程序运行的时候已经有三个文件流被打开,分别是标准输入stdin、标准输出stdout、标准出错stderr,这三者在stdio.h中也是FILE指针。

关闭文件

fclose

image
注:

  • fclose函数中使用了free,所以不能重复使用fclose对同一个文件关闭多次。

数据读取

字符读取:fgetc、getc、getchar

image
注:

  • 函数getc()的作用等效于fgetc()函数,只不过getc()函数的实现是利用宏定义而已。
  • 当使用fgetc\getc函数从文件中读取一个字符后,文件的光标(或称为文件位置指针)会自动移动到下一个字符的位置。
  • 当getc的参数为stdin(标准输入)时,getc等效于getchar

按行读取:fgets、gets

image
注:

  • 当使用fgets函数从文件中读取一行数据时,文件的光标(或称为文件位置指针)会自动移动到下一行需要读取的数据的起始位置。
  • fgets当读取到n-1个字符、或者已经读取到文件末尾(EOF)、或者读取到换行符’\n’时,函数调用停止。
  • fgets 会将换行符(如果存在)也读取到缓冲区中,同时它会在字符串的末尾添加一个空字符(\0)以标记字符串的结束。
  • gets函数是一个不推荐使用的函数,因为它不检查目标缓冲区的大小,这可能导致缓冲区溢出和安全问题(例如,缓冲区溢出攻击)。然而,就gets函数本身的行为而言,它会读取一行输入,包括换行符(如果存在的话),并将其存储在提供的字符数组中,但是换行符不会被存储在数组中。

按块读取:fread

image
注:

  • 可以使用feof和ferror这两个函数来区分读取错误或者到达文件末尾的情况

写入文件

字符写入:fputc、putc、putchar

image
注:

  • 当使用fputc函数向文件中写入一个字符时,文件的光标(或称为文件位置指针)会自动移动到下一个字符的位置。

按行写入:fputs、puts

image
注:

  • 当使用fputs函数写入一个字符串到文件时,文件的光标(或称为文件位置指针)不会自动移到下一行的起始位置。fputs只是简单地将字符串写入到当前文件光标所在的位置,并且光标会移动到字符串的末尾
  • 如果希望写入字符串后光标位于新的一行的起始位置,需要在字符串的末尾添加一个换行符(\n)。这样,当fputs写入字符串和换行符后,下一次写入操作将开始于新的一行的起始位置。

按块写入:fwrite

image
注:

  • 当使用fwrite函数向文件写入数据时,文件的光标(或称为文件位置指针)会移动到写入数据的末尾。具体来说,fwrite会将提供的数据块写入到文件的当前位置,并将光标移动到写入数据的末尾。

文件位置(光标位置)

设置位移:fseek

image

获取位移:ftell

image
注:

  • 如需获得整个文件的偏移量,需要用fseek函数将文件的光标设置为末尾。

格式访问

向指定文件中输出格式化字符串:fprintf

image

向指定缓冲区中输出格式化的字符串:sprintf

image

文件错误处理

判断读取是否到达文件末尾:feof

image

判断文件是否读(或写)异常:ferror

image

posted @ 2024-05-25 12:54  Dazz_24  阅读(58)  评论(0)    收藏  举报