头文件: #include <stdio.h>
1. 打开关闭流
FILE *fopen(const char *path, const char *mode);
功能: 打开路径名为path的指定文件。
参数:
mode: r, w, a, r+, w+, a+
返回值: 若成功,返回文件指针;若出错,返回NULL。
FILE *freopen(const char *path, const char *mode, FILE *stream);
功能: 在指定的流上打开指定的文件,若该流已经打开,则先关闭该流。
此函数一般用于将一个指定的文件打开为一个预定义的流:标准输出,标准输入,标准出错。
参数:
mode: r, w, a, r+, w+, a+
返回值: 若成功,返回文件指针;若出错,返回NULL。
FILE *fdopen(int fd, const char *mode);
功能: 将流与现有文件描述符fd相关联。
此函数常用于由创建管道和网络通信通道函数返回的描述符,这些特殊类型的文件不能用fopen打开。
参数:
mode: r, w, a, r+, w+, a+
返回值: 若成功,返回文件指针;若出错,返回NULL。
int fclose(FILE *stream);
功能: 关闭流
返回值: 若成功,返回0;若出错,返回EOF。
2. 读写流
2.1 单字符io
int getc(FILE *stream);
int fgetc(FILE *stream);
int getchar(void);
返回值: 若成功,返回下一个字符;若到达文件尾端或出错,返回EOF。
注意:getc可被实现为宏,而fgetc不能实现为宏。
int feof(FILE *stream);
int ferror(FILE *stream);
返回值: 若条件为真,返回非0;否则,返回0 。
void clearerr(FILE *stream);
功能: 清除出错标志和文件结束标志。
int fileno(FILE *stream);
返回值: 返回与该流相关联的文件描述符。
int ungetc(int c, FILE *stream);
功能: 将字符压送回流中。
返回值: 若成功,返回c;若出错,返回EOF。
int putc(int c, FILE *stream);
int fputc(int c, FILE *stream);
int putchar(int c);
返回值: 若成功,返回c;若出错,返回EOF。
注意:putc可被实现为宏,而fputc不能实现为宏。
2.2 每次一行io
char *fgets(char *s, int size, FILE *stream)
char *gets(char *s);
返回值: 若成功,返回s;若到达文件尾端或出错,返回NULL。
注意: gets删除换行符,fgets保留换行符。
int fputs(const char *s, FILE *stream);
int puts(const char *s);
返回值: 若成功,返回非负值;若出错,返回EOF。
注意: puts在输出结束后额外输出一个换行符,fgets不会。
2.3 二进制io
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
返回值: 读或写的对象数
读或写一个二进制数组。将浮点数组的第2~5个元素写到文件上:
float data[10];
fwrite(&data[2], sizeof(float), 4, fp)
其中,size为每个数组元素的长度,nmemb为欲写的元素个数。
2.4 格式化io
int printf(const char *format, ...);
int fprintf(FILE *stream, const char *format, ...);
int dprintf(int fd, const char *format, ...);
3个函数返回值,若成功,返回输出字符数,若出错,返回负值。
int sprintf(char *str, const char *format, ...);
int snprintf(char *str, size_t size, const char *format, ...);
返回值: 若成功,返回存入数组的字符数;若出错,返回负值。
功能: printf将格式化数据写到标准输出;fprintf写至指定流;dprintf写至指定的文件描述符。
sprintf将格式化的字符写入数组str中。
头文件: #include <stdarg.h>
int vprintf(const char *format, va_list ap);
int vfprintf(FILE *stream, const char *format, va_list ap);
int vdprintf(int fd, const char *format, va_list ap);
int vsprintf(char *str, const char *format, va_list ap);
int vsnprintf(char *str, size_t size, const char *format, va_list ap);
功能: 类似于上面5个函数,将可变参数表替换成了ap。
int scanf(const char *format, ...);
int fscanf(FILE *stream, const char *format, ...);
int sscanf(const char *str, const char *format, ...);
返回值: 赋值的输入项数;若输入出错或在任一转换前已到达文件尾端,返回EOF。
#include <stdarg.h>
int vscanf(const char *format, va_list ap);
int vsscanf(const char *str, const char *format, va_list ap);
int vfscanf(FILE *stream, const char *format, va_list ap);
功能: 类似于上面3个函数,将可变参数表替换成了ap。
3. 定位流
long ftell(FILE *stream);
返回值: 若成功,返回当前文件位置;若出错,返回-1L。
int fseek(FILE *stream, long offset, int whence);
参数:
whence: SEEK_SET,SEEK_CUR,SEEK_END
返回值: 若成功,返回0;若出错,返回-1。
void rewind(FILE *stream);
功能: 将一个流设置到文件起始位置。
off_t ftello(FILE *stream);
返回值: 若成功,返回当前文件位置,若出错,返回off_t-1。
int fseeko(FILE *stream, off_t offset, int whence);
返回值: 若成功,返回0;若出错,返回-1。
int fgetpos(FILE *stream, fpos_t *pos);
功能: 将文件位置指示器的当前值存入由pos执行的对象中。
返回值: 若成功,返回0;若出错,返回非0。
int fsetpos(FILE *stream, const fpos_t *pos);
功能: 设置文件位置指示器的值为pos对象保存的值。
返回值: 若成功,返回0;若出错,返回非0。
4. 内存流
FILE *fmemopen(void *buf, size_t size, const char *mode);
FILE *open_memstream(char **ptr, size_t *sizeloc);
#include <wchar.h>
FILE *open_wmemstream(wchar_t **ptr, size_t *sizeloc);
返回值: 若成功,返回流指针;若出错,返回NULL。