第五章 标准IO库

Lastest updated on November 20, 2021

#include <stdio.h>

void setbuf(FILE *__restrict __stream, char *__restrict __buf)
int setvbuf(FILE *__restrict __stream, char *__restrict __buf, int __modes, size_t __n)

buf 指向长度为BUFSIZ 的缓冲区

__modes 参数有:_IOFBF _IOLBF _IONBF 全缓冲 行缓冲 不带缓冲

带缓冲而buf 为 NULL ,则会自动分配合适长度缓冲区。P118

#include <stdio.h>

int fflush(FILE *__stream)
FILE * fopen(const char *__restrict __filename, const char *__restrict __modes)
FILE * freopen(const char *__restrict __filename, const char *__restrict __modes, FILE *__restrict __stream)
FILE * fdopen(int __fd, const char *__modes)
int fclose(FILE *__stream) 

fflush 参数为空则刷新所有输出流,正确返回 0 错误返回 EOF

__modes 有 r w a , r+ w+ a+,读、写、追加,w 和 w+ 会截断到0

fclose 正确返回0 错误为EOF

#include <stdio.h> 

int getc(FILE *__stream) // 宏
int fgetc(FILE *__stream) // 函数
int getchar(void) == getc(stdin)
int ferror(FILE *__stream) 
int feof(FILE *__stream)
void clearerr(FILE *__stream) 
int ungetc(int __c, FILE *__stream)
int putc(int __c, FILE *__stream) // 宏
int fputc(int __c, FILE *__stream) // 函数
int putchar(int __c) == putc(int __c,stdin)
char fgets(char *__restrict __s, int __n, FILE *__restrict __stream)
char gets(char *__s) // 不推荐,删除换行
int fputs(const char *__restrict __s, FILE *__restrict __stream)
int puts(const char *__s)
// 成功非负,错误EOF,添加换行

getc返回下一个字符,文件尾或出错则EOF

ferror 判断是出错还是文件尾

clearerr 清除出错标志和文件结束标志

ugetc 将c压回流中,成功返回c错误EOF

fgets 保留换行

fputs 成功非负,错误EOF

使用fgets fputs 都必须自己处理换行符

#include <stdio.h>

size_t fread(void *__restrict __ptr, size_t __size, size_t __n, FILE *__restrict __stream)
size_t fwrite(const void *__restrict __ptr, size_t __size, size_t __n, FILE *__restrict __s)

fread fwirte 都返回读或者写的对象数,在不同系统之间可能无法使用。size 为每个元素的长度(sizeof(类型名)等) n 为要写的元素个数。

#include <stdio.h>

long ftell(FILE *__stream);
off_t ftello(FILE *__stream)
int fseek(FILE *__stream, long __off, int __whence)
int fseeko(FILE *__stream, __off_t __off, int __whence)
void rewind(FILE *__stream)

ftell 当前偏移位置,错误返回-1L

fseeko 中的 whence 的选项有 SEEK_SET SEEK_CUR SEEK_END,分别代表 开始位置 当前位置 结束位置

rewind 返回文件头 == fseek(stream,0L,SEEK_SET)。

#include <stdio.h>

int fgetpos(FILE *__restrict __stream, fpos_t *__restrict __pos)
int fsetpos(FILE *__stream, const fpos_t *__pos)

成功0 错误非0 , fpos_t 是文件写入的位置。

#include <stdio.h>

int printf(const char *__restrict __format, ...);
int fprintf(FILE *__restrict __stream, const char *__restrict __format, ...)
int dprintf(int __fd, const char *__restrict __fmt, ...)
int sprintf(char *__restrict __s, const char *__restrict __format, ...)
int snprintf(char *__restrict __s, size_t __maxlen, const char *__restrict __format, ...)

printf fprintf dprintf 前三个成功返回字符数,错误为负值。 snprintf 后面第四个的 format 等参数参照 printf

#include <stdio.h>
#include <stdarg.h> //?????????????

int vprintf(const char *__restrict __format, __va_list_tag *__arg);
int vfprintf(FILE *__restrict __s, const char *__restrict __format, __va_list_tag *__arg);
int vdprintf(int __fd, const char *__restrict __fmt, __va_list_tag *__arg);
int vsprintf(char *__restrict __s, const char *__restrict __format, __va_list_tag *__arg)
int vsnprintf(char *__restrict __s, size_t __maxlen, const char *__restrict __format, __va_list_tag *__arg);

格式打印输出打印

#include <stdio.h>

int scanf(const char *__restrict __format, ...);
int fscanf(FILE *__restrict __stream, const char *__restrict __format, ...)
int sscanf(const char *__restrict __s, const char *__restrict __format, ...)

格式输入

#include <stdio.h>
#include <stdarg.h>

int vscanf(const char *__restrict __format, __va_list_tag *__arg)
int vsscanf(const char *__restrict __s, const char *__restrict __format, __va_list_tag *__arg)
int vfscanf(FILE *__restrict __s, const char *__restrict __format, __va_list_tag *__arg)

输入

#include <stdio.h>

int fileno(FILE *__stream)
char * tmpnam(char *__s)
// 【不推荐使用】临时文件,参数可为nullptr,不为空则指向至少 L_tmpnam 个字符的数组
FILE * tmpfile(void);

fileno 返回文件描述符

#include <stdlib.h>

char * mkdtemp(char *__template)
int mkstemp(char *__template)

char name[] = "/tmp/testXXXXXX"
mkdtemp(name);

mkdtemp 返回指向目录的指针,错误为null

mkstemp 返回文件描述符,错误为 -1。参数要提前声明赋值好,最后六位要是大写的X,例如

// 内存流 ??????
#include <stdio.h>

FILE * fmemopen(void *__s, size_t __len, const char *__modes)
FILE * open_memstream(char **__bufloc, size_t *__sizeloc)
// 面向宽字节

#include <wchar.h>

open_wmemstream(wchar_t **__bufloc, size_t *__sizeloc)