介绍常用文件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) |
参数
fflush()
描述
C 库函数 int fflush(FILE *stream) 将缓冲区中任何未写的数据发送到stream指向的文件。如果是stream是空指针,将刷新掉所有的输出缓冲。
声明
1 | int fflush(FILE *stream) |
参数
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 参数不同,则会显示一个错误。