文件I/O操作-常用库函数

介绍常用文件I/O操作的函数:fopen(), getc(), putc(), fclose(), fprintf(), fscanf(), fgets(), fputs(), rewind(), fseek(), ftell(), fflush(), ungetc(), setvbuf(), fgetpos(), fsetpos(), feof(), ferror(), fread(), fwrite()

I/O级别

  I/O级别一般分为低级I/O (low-level I/O)和标准高级I/O (standard high-level I/O)。 低级I/O使用操作系统提供的基本I/O服务;标准高级I/O使用一个标准的C库函数包和stdio.h头文件的定义。因为无法保证所有操作系统都使用相同的低级I/O模型,所以ANSI C只支持标准I/O模型,保证程序的可移植性。

标准文件

  C程序运行后,会自动打开3个文件。这3个文件被称为标准输入(standard input),标准输出(standard output),标准错误输出(standard error output)。默认输入设备是键盘, 输出设备就是显示器。

标准文件指针

标准文件 文件指针 一般使用设备
标准输入 stdin 键盘
标准输出 stdout 显示器
标准错误 stderr 显示器

  这些都是FILE指针类型,所以可用备用做标准I/O函数的参数。

库函数

fopen()

描述

C 库函数 FILE *fopen(const char *filename, const char *mode) 使用给定的模式 mode 打开 filename 所指向的文件。

声明

1
FILE *fopen(const char *filename, const char *mode)

参数

  • filename – 这是 C 字符串,包含了要打开的文件名称。
  • mode – mode – 这是 C 字符串,包含了文件访问模式。
    模式字符串 意义
    “r” 打开一个用于读取的文件。该文件必须存在。
    “w” 创建一个用于写入的空文件。如果文件名称与已存在的文件相同,则会删除已有文件的内容,文件被视为一个新的空文件。
    “a” 追加到一个文件。写操作向文件末尾追加数据。如果文件不存在,则创建文件。
    “r+” 打开一个用于更新的文件,可读取也可写入。该文件必须存在。
    “w+” 创建一个用于读写的空文件。
    “a+” 打开一个用于读取和追加的文件。
    “rb”,”wb”,”ab”,”ab+”,”a+b”,”wb+”,”w+b”,”ab+”,”a+b” 与前面模式相似,只是使用二进制模式打开文件

注: 对于Unix和linux只有一种文件类型,带b和不带b的模式是相同的。

返回值

该函数返回一个 FILE 指针。否则返回 NULL。

fclose()

描述

C 库函数 int fclose(FILE *stream) 关闭流 stream。刷新所有的缓冲区。

声明

1
int fclose(FILE *stream)

参数

  • stream – 这是指向 FILE 对象的指针,该 FILE 对象指定了要被关闭的流。

返回值

如果流成功关闭,则该方法返回零。如果失败,则返回 EOF。

getc()

描述

C 库函数 int getc(FILE *stream) 从指定的流 stream 获取下一个字符(一个无符号字符),并把位置标识符往前移动。

声明

1
int getc(FILE *stream)

参数

  • stream – 这是指向 FILE 对象的指针,该 FILE 对象标识了要在上面执行操作的流。

返回值

该函数以无符号 char 强制转换为 int 的形式返回读取的字符,如果到达文件末尾或发生读错误,则返回 EOF。

putc()

描述

C 库函数 int putc(int char, FILE *stream) 把参数 char 指定的字符(一个无符号字符)写入到指定的流 stream 中,并把位置标识符往前移动。

声明

1
int putc(int char, FILE *stream)

参数

  • char – 这是要被写入的字符。该字符以其对应的 int 值进行传递。
  • stream – 这是指向 FILE 对象的指针,该 FILE 对象标识了要被写入字符的流。

返回值

该函数以无符号 char 强制转换为 int 的形式返回写入的字符,如果发生错误则返回 EOF。

fprintf()

描述

C 库函数 int fprintf(FILE *stream, const char *format, …) 发送格式化输出到流 stream 中。

声明

1
int fprintf(FILE *stream, const char *format, ...)

参数

  • stream – 这是指向 FILE 对象的指针,该 FILE 对象标识了流。
  • format – 这是 C 字符串,包含了要被写入到流 stream 中的文本。它可以包含嵌入的 format 标签,format 标签可被随后的附加参数中指定的值替换,并按需求进行格式化。

返回值

如果成功,则返回写入的字符总数,否则返回一个负数。

fscanf()

描述

C 库函数 int fscanf(FILE *stream, const char *format, …) 从流 stream 读取格式化输入。

声明

1
int fscanf(FILE *stream, const char *format, ...)

参数

  • stream – 这是指向 FILE 对象的指针,该 FILE 对象标识了流。
  • format – 这是 C 字符串,包含了以下各项中的一个或多个:空格字符、非空格字符 和 format 说明符。

返回值

如果成功,该函数返回成功匹配和赋值的个数。如果到达文件末尾或发生读错误,则返回 EOF。

fgets()

描述

C 库函数 char *fgets(char *str, int n, FILE *stream) 从指定的流 stream 读取一行,并把它存储在 str 所指向的字符串内。当读取 (n-1) 个字符时,或者读取到换行符时,或者到达文件末尾时,它会停止,具体视情况而定。

声明

1
char *fgets(char *str, int n, FILE *stream)

参数

  • str – 这是指向一个字符数组的指针,该数组存储了要读取的字符串。
  • n – 这是要读取的最大字符数(包括最后的空字符)。通常是使用以 str 传递的数组长度。
  • stream – 这是指向 FILE 对象的指针,该 FILE 对象标识了要从中读取字符的流。

返回值

如果成功,该函数返回相同的 str 参数。如果到达文件末尾或者没有读取到任何字符,str 的内容保持不变,并返回一个空指针。如果发生错误,返回一个空指针。

fputs()

描述

C 库函数 int fputs(const char *str, FILE *stream) 把字符串写入到指定的流 stream 中,但不包括空字符。

声明

1
int fputs(const char *str, FILE *stream)

参数

  • str – 这是一个数组,包含了要写入的以空字符终止的字符序列。
  • stream – 这是指向 FILE 对象的指针,该 FILE 对象标识了要被写入字符串的流。

返回值

该函数返回一个非负值,如果发生错误则返回 EOF。

rewind()

描述

C 库函数 void rewind(FILE *stream) 设置文件位置为给定流 stream 的文件的开头。

声明

1
void rewind(FILE *stream)

参数

  • stream – stream – 这是指向 FILE 对象的指针,该 FILE 对象标识了流。

fseek()

描述

C 库函数 int fseek(FILE *stream, long int offset, int whence) 设置流 stream 的文件位置为给定的偏移 offset,参数 offset 意味着从给定的 whence 位置查找的字节数。

声明

1
int fseek(FILE *stream, long int offset, int whence)

参数

  • stream – 这是指向 FILE 对象的指针,该 FILE 对象标识了流。
  • offset – 这是相对 whence 的偏移量,以字节为单位。
  • whence – 这是表示开始添加偏移 offset 的位置。它一般指定为下列常量之一:
    常量 偏移量的起始点
    SEEK_SET 文件开始
    SEEK_CUR 当前位置
    SEEK_END 文件结尾

返回值

如果成功,则该函数返回零,否则返回非零值。

ftell()

描述

C 库函数 long int ftell(FILE *stream) 返回给定流 stream 的当前文件位置。

声明

1
long int ftell(FILE *stream)

参数

  • stream – 这是指向 FILE 对象的指针,该 FILE 对象标识了流。

    返回值

    该函数返回位置标识符的当前值。如果发生错误,则返回 -1L,全局变量 errno 被设置为一个正值。

fflush()

描述

C 库函数 int fflush(FILE *stream) 将缓冲区中任何未写的数据发送到stream指向的文件。如果是stream是空指针,将刷新掉所有的输出缓冲。

声明

1
int fflush(FILE *stream)

参数

  • stream – 这是指向 FILE 对象的指针,该 FILE 对象指定了一个缓冲流。

    返回值

    如果成功,该函数返回零值。如果发生错误,则返回 EOF,且设置错误标识符(即 feof)。

ungetc()

描述

C 库函数 int ungetc(int char, FILE *stream) 把字符 char(一个无符号字符)推入到指定的流 stream 中,以便它是下一个被读取到的字符。

声明

1
int ungetc(int char, FILE *stream)

参数

  • char – 这是要被推入的字符。该字符以其对应的 int 值进行传递。
  • stream – 这是指向 FILE 对象的指针,该 FILE 对象标识了输入流。

    返回值

    如果成功,则返回被推入的字符,否则返回 EOF,且流 stream 保持不变。

setvbuf()

描述

C 库函数 int setvbuf(FILE *stream, char *buffer, int mode, size_t size) 定义流 stream 应如何缓冲。(即为stream创建一个大小为size,模式为mode的替换缓冲区buffer)

声明

1
int setvbuf(FILE *stream, char *buffer, int mode, size_t size)

参数

  • stream – 这是指向 FILE 对象的指针,该 FILE 对象标识了一个打开的流。
  • buffer – 这是分配给用户的缓冲。如果设置为 NULL,该函数会自动分配一个指定大小的缓冲。
  • mode – 这指定了文件缓冲的模式,如下:
  • size –这是缓冲的大小,以字节为单位。
    模式 意义
    _IOFBF 全缓冲:对于输出,数据在缓冲填满时被一次性写入。对于输入,缓冲会在请求输入且缓冲为空时被填充。
    _IOLBF 行缓冲:对于输出,数据在遇到换行符或者在缓冲填满时被写入,具体视情况而定。对于输入,缓冲会在请求输入且缓冲为空时被填充,直到遇到下一个换行符。
    _IONBF 无缓冲:不使用缓冲。每个 I/O 操作都被即时写入。buffer 和 size 参数被忽略。

返回值

如果成功,则该函数返回 0,否则返回非零值。

fgetpos()

描述

C 库函数 int fgetpos(FILE *stream, fpos_t *pos) 获取流 stream 的当前文件位置,并把它写入到 pos。

声明

1
int fgetpos(FILE *stream, fpos_t *pos)

参数

  • stream – 这是指向 FILE 对象的指针,该 FILE 对象标识了流。
  • pos – 这是指向 fpos_t 对象的指针。

返回值

如果成功,该函数返回零。如果发生错误,则返回非零值。

fsetpos()

描述

C 库函数 int fsetpos(FILE *stream, const fpos_t *pos) 设置给定流 stream 的文件位置为给定的位置。参数 pos 是由函数 fgetpos 给定的位置。

声明

1
int fsetpos(FILE *stream, const fpos_t *pos)

参数

  • stream – 这是指向 FILE 对象的指针,该 FILE 对象标识了流。
  • pos – 这是指向 fpos_t 对象的指针,该对象包含了之前通过 fgetpos 获得的位置。

返回值

如果成功,该函数返回零值,否则返回非零值,并设置全局变量 errno 为一个正值,该值可通过 perror 来解释。

feof()

描述

C 库函数 int feof(FILE *stream) 测试给定流 stream 的文件结束标识符。

声明

1
int feof(FILE *stream)

参数

  • stream – 这是指向 FILE 对象的指针,该 FILE 对象标识了流。

返回值

当设置了与流关联的文件结束标识符时,该函数返回一个非零值,否则返回零。

ferror()

描述

C 库函数 int ferror(FILE *stream) 测试给定流 stream 的错误标识符。

声明

1
int ferror(FILE *stream)

参数

  • stream – 这是指向 FILE 对象的指针,该 FILE 对象标识了流。

返回值

如果设置了与流关联的错误标识符,该函数返回一个非零值,否则返回一个零值。

fread()

描述

C 库函数 size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream) 从给定流 stream 读取数据到 ptr 所指向的数组中。

声明

1
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)

参数

  • ptr – 这是指向带有最小尺寸 size*nmemb 字节的内存块的指针(数组)。
  • size – 这是要读取的每个元素的大小,以字节为单位。
  • nmemb – 这是元素的个数,每个元素的大小为 size 字节。
  • stream – 这是指向 FILE 对象的指针,该 FILE 对象指定了一个输入流。

返回值

成功读取的元素总数会以 size_t 对象返回(正常与nmemb相等),size_t 对象是一个整型数据类型。如果总数与 nmemb 参数不同,则可能发生了一个错误或者到达了文件末尾。

fwrite()

描述

C 库函数 size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream) 把 ptr 所指向的数组中的数据写入到给定流 stream 中。

声明

1
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)

参数

  • ptr – 这是指向要被写入的元素数组的指针。
  • size – 这是要被写入的每个元素的大小,以字节为单位。
  • nmemb – 这是元素的个数,每个元素的大小为 size 字节。
  • stream – 这是指向 FILE 对象的指针,该 FILE 对象指定了一个输入流。

返回值

如果成功,该函数返回一个 size_t 对象,表示元素的总数,该对象是一个整型数据类型。如果该数字与 nmemb 参数不同,则会显示一个错误。