标准I/O库
标准I/O库(stdio)及其头文件stdio.h为系统调用提供了一个通用的接口,这个库是ANSI标准C的一部分,在很多方面使用标准I/O库和使用描述符一样,首先需要打开一个文件以建立一个访问路径,这个操作的返回值将作为其他I/O库函数的参数。在I/O库中,与描述符对应的是流,以FILE类型的指针实现。
fopen函数
#include”stdio.h”
FILE * fopen (const char *filename,const char *mode);
fopen打开由filename参数指定的文件,并把它与一个文件流关联起来。mode参数指定文件的打开方式
- “r”或“rb”:以只读方式打开;
- “w”或“wb”:以写方式打开,并把文件长度截断为0;
- “a”或“ab”:以写方式打开,新内容加到后面;
- “r+”或“rb+”或“r+b”:以更新方式打开;
- “w+”:以更新的方式带宽,并把文件长度截断为0;
- “a+”:以更新的方式打开,新内容追加在文件尾。
字母b表示文件是一个二进制文件而不是文本文件。
fopen成功时返回一个非空的FILE *指针,失败返回NULL,文件流和fd一样是有限的在stdio.h中定义FOPEN_MAX来定义的
fread函数
fread库函数用于一个从文件流读取数据,数据从文件流stream读到由ptr指向的数据缓冲区里,fread和fwrite都是对数据记录进行操作,size参数指向每个数据记录的长度,计数器nitems给出要传输的记录个数。它的返回值是成功读到数据缓冲区里的记录个数(而不是字节数)。当到达文件尾时,它的返回值可能会小于nitems,甚至可以是零。
#include"stdio.h"
size_t fread(void *ptr ,size_t size ,size_t nitems,FILE *stream); // 返回值为成功读到缓冲区的个数,nitems是读缓冲区的个数
对所有向缓冲区写数据的标准I/O来说,为数据分配空间和检查错误是程序员的责任,同时使用ferror和feof函数来做这些事。
fwrite函数
fwrite和fread类似,返回的是成功写入的记录个数。
#include"stdio.h"
size_t fwrite(const void *ptr ,size_t sieze,size_t nitems,FILE *stream );
fclose函数
fclose函数关闭指定文件流,使所有尚未写出的数据都写出,如果程序需要确保数据已经全部写出,就应该调用fclose函数。虽然当程序正常结束时,会自动对所有还打开的文件流调用fclose函数,但这样就无法检查由fclose
产生的抱错了。
#include"stdio.h"
int fclos (FILE *stream);
fflush函数
fflush函数的作用是吧文件流里的所有未写出数据立刻写出,在调试的时候可以用它来确定程序是正在写数据而不是被挂起了。
fgetc、getc和getchar函数
fgetc
函从文件流里取出下一个字节并把它作为一个字符返回。当它们到达文件尾或出现错误时,返回EOF,必须通过ferror或feof来区分这两种情况。函数原型如下:
#include"stdio.h"
int fgetc(FILE *stream);
int getc(FILE *stream);
int getchar();
getc
函数的作用和fgetc
一样,但它有可能被实现为一个宏,如果是这样,stream
参数就可能被计算不止一次,所以它不能有副作用(不能改变变量的值)。此外你也不能保证能够使用getc
的地址作为一个指针函数。
getchar
相当于getc(stdin)
,它从标准输入里读取下一个字符。
fputc、putc和putchar函数
fputc
函数把一个字符写到一个输出文件流中,它返回写入的值,如果失败返回EOF
#include"stdio.h"
int fputc(int c ,FILE *stream);
int putc(int c,FILE *stream);
int putchar (int c);
类似fgetc
和getc
之间的关系,putc
函数的作用也相当于fputc
,但它可能被实现为一个宏,putchar
函数相当于putc(c,stdout)
,它把单个字符写到标准输出,putchar
和getchar
都是吧字符当做int
类型而不是char
使用,这就允许文件尾取值-1,这是一个超出字符数字编码范围的值。
fgets和gets函数
fgets
函数从输入文件流stream
里读取一个字符串
#include"stdio.h"
char *fgets(char *s,int n, FILE *stream);
char *gets(char *s);
fgets
把读到的字符写到s指向的字符串里,知道出现下面某种情况:遇到换行符,已经传输了n-1个字符,或者达到文件尾。它会把遇到的换行符也传递到接受字符串里,再加上一个表示结尾的空字符\0
。一次调用最多传输n-1个字符,因为它必须把空字节加上,返回值为一个指向字符串s的指针。如果文件流已经到文件尾,fgets
返回一个空指针并设置errno以指出处错误的类型。