Stdio.h
出自C语言资料库
部分宏及类型定义
#define BUFSIZ 1024 //缓冲区大小
#define EOF (-1)
#define FILENAME_MAX 255 //文件名最大长度
#define FOPEN_MAX 20 //同时打开文件数量的最大值
#define L_tmpnam 16 //临时文件名的最大长度
#define NULL 0 //空指针值
#define TMP_MAX 65535 //临时文件数量上限
typedef
long
pos_t;
typedefunsigned size_t;
typedefchar * va_list;
结构类型FILE的成员用于描述文件的当前状态,这些成员的名称和数量因系统而异,下面是一个例子:
typedefstruct{int cnt;
unsigned *b_ptr;
unsigned *base;
int bufsize;
short flag;
char td;
} FILE;
extern FILE _iob[];
FILE类型的对象应该可以记录控制一个流所需要的所有信息,包括文件位置指示符、指向相关缓冲区的指针、
记录是否发生了读写错误的错误指示符、记录是否到达文件尾的EOF标志。它的实现因系统而异。例如,错误指示符
和文件尾指示符可以按位组合于结构成员flag中。
一般情况下,fpos_t类型的定义如下:
typedeflong fpos_t;
这种类型的对象应该可以记录唯一地指定文件中的每个位置所需要的所有信息。
stdin、stdout、stderr都是用宏的形式实现的。尽管我们可以把它们看成是文件,但它们实际上是指针。
#define stdin (&_iob[0])#define stdout (&_iob[1])#define stderr (&_iob[2])
和其它文件不同,stdin、stdout和stderr不需要由程序员显式打开。
这个头文件还包含了其它一些由函数使用的宏:
#define _IOFBF 0 //完全缓冲#define _IOLBF 0x80 //行缓冲#define _IONBF 0x04 //无缓冲#define SEEK_SET 0 //fseek从文件开始位置寻找的信号#define SEEK_CUR 1 //fseek从文件当前位置寻找的信号#define SEED_END 2 //fseek从文件结尾寻找的信号
当一个文件被打开时,操作系统把它与一个流相关联,并用一个FILE类型的对象来记录流的信息。我们既可以
把指向FILE结构的指针看成是文件,马可以把它看成是流。
文件操作函数
FILE *fopen(constchar *filename,constchar *mode);
执行打开一个缓冲文件所需要的维护性操作。如果调用成功,它会创建一个流,并返回一个与此流相关联的
FILE指针。如果filename无法访问。它就返回NULL。
int fclose(FILE *fp);
所有缓冲数据都被发送。如果调用成功,这个函数返回0,否则返回EOF。
FILE *freopen(constchar *filename,constchar *mode,FILE *fp);
关闭与fp相关联的文件,用mode指定的模式打开filename,并把fp与这个新文件相关联。如果调用成功,这个
函数返回fp,否则返回NULL。这个函数用于更改与stdin、stdout或者stderr相关联和文件。
void setbuf(FILE *fp,char *buf);
如果fp不为NULL,调用setbuf(fp,buf)相当于:
setvbuf(fp,buf,_IOFBF,BUFSIZ)
区别是它不返回任何值。如果fp为NULL,所使用的模式是_IONBF。
int setvbuf(FILE *fp,char *buf,int mode,size_t n);
确定与fp相关联的文件的缓冲方式。
FILE *tmpfile(void);
以"wb+"模式打开一个临时文件,并返回一个与这个文件相关联的指针。
char *tmpnam(char *s);
创建一个唯一的临时名称,一般用作文件名。
int fseek(FILE *fp,long offset,int place);
为下一个输入或输出操作设置文件位置指示符。
long ftell(FILE *fp);
返回与fp相关联的文件的文件位置指示符的当前值。
void rewind(FILE *fp);
把文件位置指示符设置为文件起始位置,并清除文件尾指示符和错误提示符。
调用rewind(fp)相当于调用:(void) fseek(fp,0L,SEEK_SET),唯一的区别是fseed()只清除文件尾指示符。
int fsetpos(FILE *fp,const fpos_t *pos);
把文件位置指示符设置为pop指向的值。
错误处理
void clearerr(FILE *FP);
清除与fp相关联的错误指示符和文件结束指示符。
int feof(FILE *fp);
如果与fp相关联的文件的文件结束符已经被设置,这个函数返回一个非0值。
int ferror(FILE *fp);
如果与fp相关联的文件的错误指示符已经被设置,这个函数返回一个非0值。
void perror(constchar *s);
在stderr中打印一条与errno相关的错误信息。首先打印的是字符串s,然后是一个冒号和一个空格,之后打印的
是相关的错误信息,最后是个换行符。sterror(errno)只打印出相关的错误信息。
字符输入、输出
int
getc(FILE *fp);
相当于fgetc(),区别在于它是以宏的形式实现的。
int getchar(void);
相当于调用getc(stdin)。
char *gets(char *s);
从stdin读取字符,并把它们存储在s所指向的数组中,直到读取到换行符或遇见文件尾标志。
int fgetc(FILE *s);
从与fp相关联的文件读取下一个字符,并返回所读取字符的值。
char *fgets(char *line,int n,FILE *fp);
从与fp相关联的文件最多读取n-1个字符到line所指向的数组。
int fputc(int c,FILE *fp);
把参数c转换为unsignedchar类型,并把它写入到与fp相关联的文件。
int fputs(constchar *s,FILE *fp);
把以null结尾的字符串s复制到与fp关联的文件中,但不包含结尾的null字符(相关的函数puts()添加一个换行符).
int putc(int c,FILE *fp);
puts()函数相当于fputc(),只不过它是用宏实现的。
int putchar(int c);
调用putchar(c)相当于调用putc(c,stdout)int puts(constchar *s);
把以NULL结尾的字符串s复制以标准输出文件,但不包括结尾的null字符,并在最后写入一个换行符(相关函数fputs()不写入换行符)。
int ungetc(int c,FILE *fp);
如果c值不是EOF,就把(unsignedchar) c这个值压回到与fp 相联的流中。
格式化输入、输出
int
fprintf(FILE *fp,constchar *cntrl_string,...);
把格式化文本写入到与fp关联的文件中,并返回写入的字符数。
intprintf(constchar *cntrl_string,...);
printf(cntrl_string,other_arguments)这种形式的调用相当于: fprintf(stdout,cntrl_string,other_arguments)int sprintf(char *s,constchar *cntrl_string,...);
这是字符串版本的printf()。它并不是写入到stdout,而是写入到s所指向的字符串。
int vfprintf(FILE *fp,constchar *cntrl_string,va_list ap);
int vprintf(constchar *cntrl_string,va_list ap);
int vsprintf(char *s,constchar *cntrl_string,va_list ap);
这些函数分别对应于fprintf()、printf()、sprintf()。它们并不使用可变长度的参数列表,而是使用一个在stdarg.h中定义的参数数组指针
int fscanf(FILE *fp,constchar *cntrl_string,...);
从与fp相关联的文件流中读取文本,并根据控制字符串的指令对它们进行处理。
int scanf(constchar *cntrl_string,...);
scanf(cntrl_string,other_arguments)相当于fscanf(stdin,cntrl_string,other_arguments)int sscanf(constchar *s,constchar *cntrl_string,...);
这是字符串版本的scanf()。
直接输入、输出
size_t fread(void *a_ptr, size_t el_size, size_t n, FILE *fp);
从与fp相关联的文件最多读取n*el_size个字节(字符)到a_ptr所指向的数组.
size_t fwrite(constvoid *a_ptr,size_t el_size,sizt_t n,FILE *fp);
从a_ptr所指向的数组读取n*el_size个字节(字符),并把它们写入到与fp相关联的文件。
删除或重命名文件
int
remove(constchar *filename);
从文件系统中删除名称为filename的文件。如果调用成功,这个函数返回0,否则返回-1(传统C中的unlink()函数)。
int rename(constchar *from,constchar *to);
修改文件名称,旧名称是from所指向的字符串,新名称是to所指向的字符串。
|