数据流有两种通用类型,文本流与二进制流,文本流由分成行的字符序列组成,二进制流是char类型的数据值序列。基于数据流的概念,C语言有丰富而有用途的输入输出函数,这些函数多在stdio.h、wchar.h中定义,数据类型FILE保存数据流的信息。
FILE* fopen(const char* restrict filename, const char* restrict mode);
fopen带有文件名和存取方式两个参数,文件名按实现指定的方式打开或建立文件,将其和一个数据流相关联,宏FILENAME_MAX指定了文件名的最大长度,FOPEN_MAX指定了可以同时打开的数据流个数,至少为8个,包括stdin、stdout、stderr。
int fclose(FILE* restrict stream);
fclose按适当方式有序地关闭已打开的数据流,包括清空必要的内部数据缓冲区,错误返回EOF,否则返回0。
int fflush(FILE* restrict stream);
fflush用于清空与输出或更新数据流参数相关的任何缓冲区,通常只用于异常情况,正常情况下由fclose与exit负责刷新输出缓冲区。
FILE* freopen(const char* restrict filename,
const char* restrict mode,
FILE* restrict stream);
freopen类似与先后调用了fclose和fopen,一个主要用途是将stdin、stdout与stderr之一重新关联到另一文件。
int fwide(FILE* restrict stream, int orient);
fwide用来设置与测试流定向。
int setvbuf(FILE* restrict stream,
char* restrict buf,
int bufmode,
size_t size);
setvbuf允许编程人员在极少数默认缓冲区无法满足要求的情况下控制数据流的缓冲策略,函数要在打开流之后和读取或写入任何数据之前调用。
void setbuf(FILE* restrict stream,
char* restrict buf);
setbuf是setvbuf的简化形式。
int fseek(FILE* restrict stream, long int offset, int wherefrom);
fseek设置数据流位置,wherefrom可选SEEK_SET、SEEK_CUR、SEEK_END,分别表示0、1、2,即文件开头、文件当前、文件结尾位置。
long int ftell(FILE* restrict stream);
ftell返回数据流当前位置。
void rewind(FILE* restrict stream);
rewind将数据流复位到开头。
int fgetpos(FILE* restrict stream, fpos_t *pos);
fgetpos将当前文件位置存放在pos所指的对象中,主要用于大文件的处理。
int fsetpos(FILE* restrict stream, const fpos_t *pos);
fsetpos根据*pos的值设置当前文件位置,也是主要用于大文件的处理。
int fgetc(FILE* stream);
fgetc从输入流中读取下一个字符并将其作为int类型的值返回。输出与fputc对应。
int getc(FILE* stream);
getc与fgetc类似,只是getc通常实现为宏,更加高效。输出与putc对应。
int getchar(void);
getchar等价于getc(stdin),也通常实现为宏。输出与putchar对应。
int ungetc(int c, FILE *stream);
ungetc将字符c转换成无符号char并推回指定的输入流。
char* fgets(char *s, int n, FILE* stream);
fgets将字符从输入流中读取到s中,最多读取n-1个字符,然后在末尾添加一个终止null字符。输出与fputs对应。
char* gets(char *s);
gets从标准输入流stdin读取字符到字符数组s中,但很危险,因为长度未知。输出与puts对应。
int fscanf(FILE* restrict stream, const char* restrict format, …);
int vfscanf(FILE* restrict stream, const char* restrict format, va_listarg);
fscanf分析格式化输入文本,从第一个参数指定的数据流读取字符并控制字符串格式转换序列,根据控制字符串内容,可能还需要其它参数,控制字符串后面的每个参数应为指针,从输入流读取的值转换之后存放在指针指定的对象中,vfscanf增加了可变参数表。输出与fprintf、vfprintf对应。
int scanf(const char* restrict format, …);
int vscanf(const char* restrict format, va_list arg);
scanf从标准输入流stdin读取字符,vscanf增加了可变参数表。输出与printf、vprintf对应。
int sscanf(char *s, const char* restrict format, …);
int vsscanf(char *s, const char* restrict format, va_list arg);
sscanf从字符串s读取字符,vsscanf增加了可变参数表。输出与sprintf、vsprintf对应,c99增加了snprintf,可以计算非宽字符的字符数。
size_t fread(void* restrict ptr,
size_t element_size,
size_t count,
FILE* restrict stream);
size_t fwrite(const void* restrict ptr,
size_t element_size,
size_t count,
FILE* restrict stream);
fread和fwrite分别输入和输出到二进制文件。
int feof(FILE* stream);
int ferror(FILE* stream);
void clearerr(FILE* stream);
feof的参数是个输入流,如果读取输入流时遇到文件末尾,则返回一个非0值,否则返回0,这个函数通常在输入操作失败之后使用。ferror返回数据流的错误状态。clearerr重置数据流中的任何错误和文件末尾指示,用fclose关闭数据流时也重置错误条件。
int rename(const char *oldname, const char *newname);
int remove(const char *filename);
remove删除指定文件,在操作成功时返回0,否则返回非0值。rename将名称oldname变成newname。
FILE* tmpfile(void);
char* tmpnam(char *buf);
tmpfile生成一个新文件并用fopen方式“w+b”打开,文件关闭或程序终止时,删除这个文件。tmpnam生成不与当前使用的其它文件名发生冲突的新文件名,这样生成的文件不是临时文件,程序终止时并不自动删除这个文件。