FILE * fopen (const char * restrict filename, const char * restrict modes)
打开一个文件流。
它的第一个参数是要打开的文件名;更确切地说,是包含该文件名的字符串的地址。第二个参数是用于指定文件打开模式的一个字符串。返回值为文件指针。
C库提供了一些可能的模式:
模式字符串 | 意义 |
"r" | 打开一个文本文件,只可以读取文件。文件必须存在。 |
"w" | 打开一个文本文件,只可以写入文件,先将文件的长度截为零。如果该文件不存在则先创建之。 |
"a" | 打开一个文本文件,只可以向已有文件的结尾追加内容。初始时文件指针定位在文件结束位置。如果该文件不存在则先创建之。 |
"r+" | 打开一个文本文件,可以进行更新,也即可以读取和写入文件。初始时文件指针定位在文件开始位置。文件必须存在。 |
"w+" | 打开一个文本文件,可以进行更新(读取和写入),如果该文件存在则首先将其长度截为零;如果不存在则先创建之。 |
"a+" | 打开一个文本文件,可以进行更新(读取和写入),向已有文件的尾部追加内容,如果该文件不存在则先创建之;可以读取整个文件,但写入时只能追加内容。 |
"rb", "wb", "ab", "ab+", "a+b", "wb+", "w+b", "ab+", "a+b" |
与前面的模式类似,只是使用二进制模式而非文本模式打开文件 |
对于像Unix和Linux这样只有一种文件类型的系统,带b字母的模式和对应的不带b字母的模式是相同的。
int fclose (FILE *stream)
关闭已打开的文件流,同时根据需要刷新缓冲区。更正规的程序也许还要检查是否成功关闭了文件。
参数为文件指针。如果文件成功关闭,函数返回0,否则返回EOF。
int fflush (FILE *stream)
刷新指定文件流的缓冲区。如果参数为空则刷新所有缓冲区。
int getc (FILE *stream)
int fgetc (FILE *stream)
从指定文件中获得一个字符。如果读到文件结尾则返回EOF。
int putc (int c, FILE *stream)
int fputc (int c, FILE *stream)
将字符c写入FILE指针指定的文件中。如果成功则返回该字符,否则返回EOF。
int fprintf (FILE * restrict, const char * restrict, ...)
格式化输出函数,第一个参数为文件指针,后两个参数与printf相同。
返回被成功输出的字符数。
int fscanf (FILE * restrict, const char * restrict, ...)
格式化输入函数,第一个参数为文件指针,后两个参数与scanf相同。
返回成功输入的变量个数,遇到文件结尾返回EOF。
char * fgets (char * restrict s, int n, FILE * restrict stream)
输入一个字符串。
第一个参数为目的字符串数组,第二个参数为要读取的最大长度,第三个参数为文件来源。返回该字符串地址,遇到文件结尾返回NULL。
该函数读取到它所遇到的第一个换行字符的后面,或者读取比最大长度n少一个字符,或者读取到文件结尾时结束。然后向末尾添加一个空字符以构成一个字符串。
与gets不同的是,fgets函数不会丢弃换行符。
int fputs (const char * restrict s, FILE * restrict stream)
输出一个字符串。
第一个参数为字符串的源地址,第二个参数为目的文件。写入成功返回一个非负值,失败返回EOF。与puts不同的是,fputs不会额外输出换行符。
int fseek (FILE * stream, long int off, int whence)
fseek( )函数允许您像对待数组一样对待一个文件,在打开的文件中直接移动到任意字节处。
第一个参数是指向文件的FILE指针;第二个参数称为偏移量,表示从起始点开始要移动的距离;第三个参数是模式,用来标识起始点。如果一切正常,fseek( )返回值为0,出现错误返回-1。
模式常量如下:
模式 | 偏移量起点 |
SEEK_SET | 文件开始 |
SEEK_CUR | 当前位置 |
SEEK_END | 文件结尾 |
函数调用的例子:
fseek (fp, 0L, SEEK_SET); // 找到文件的开始处
fseek (fp, 10L, SEEK_SET); // 找到文件的第10个字节
fseek (fp, 2L, SEEK_CUR); // 从文件的当前位置向前移动2个字节
fseek (fp, 0L, SEEK_END); // 到达文件结尾处
fseek (fp, -10L, SEEK_END); // 从文件结尾处退回10个字节
ANSI对该函数降低了要求:
对于二进制模式,C实现不需要支持SEEK_END模式。
在文本模式中,只要求保证如下这些调用有效:
fseek (file, 0L, SEEK_SET) | 到文件开始 |
fseek (file, 0L, SEEK_CUR) | 在当前位置不动 |
fseek (file, 0L, SEEK_END) | 到文件结尾 |
fseek (file, ftell-pos, SEEK_SET) | 到距文件开始处ftell-pos字节的位置,ftell-pos是ftell( )的返回值 |
long int ftell (FILE * stream)
以一个long类型值返回一个文件的当前位置。
void rewind (FILE * stream)
将当前指针回到文件的开始处。
int ungetc (int c, FILE * stream)
将c指定的字符放回输入流中。如果向输入流中放入了一个字符,下次调用标准输入函数就会读入那个字符。ANSI C标准保证每次只会放回一个字符。若调用成功,该函数返回回退的字符,否则返回EOF。
int setvbuf (FILE * restrict stream, char * restrict buf, int modes, size_t n)
建立一个供标准I/O函数使用的替换缓冲区。打开文件以后,在没有对流进行任何操作以前,可以调用这个函数。
由指针stream指定流;buf指向将使用的存储区,如果buf的值是NULL则函数会自己分配一个缓冲区,否则必须已经创建这个缓冲区;n指定数组的大小;modes从以下选项中选取:_IOFBF表示完全缓冲(缓冲区满的时候刷新),_IOLBF表示行缓冲(缓冲区满的或者一个新行写入的时候刷新),_IONBF表示无缓冲。如果成功执行,函数会返回0;否则返回一个非零值。
size_t fread (void * restrict ptr, size_t size, size_t n, FILE * restrict stream)
二进制方式读取文件中的内容到ptr数组中。
ptr指向目的地,size表示每次读取的数据块的大小,n表示读取的数据块的数量,stream表示文件来源。返回成功读入的数据块的数量。
size_t fwrite (const void * restrict ptr, size_t size, size_t n, FILE * restrict stream)
二进制方式写入ptr数组中的内容到文件中。
ptr指向数据源,size表示每次读取的数据块的大小,n表示读取的数据块的数量,stream表示目的文件。返回成功写入的数据块的数量。
int feof (FILE * stream)
如果最近一次输入调用检测到文件结尾,feof( )函数返回一个非零值(表示真),否则返回零值(表示假)。
int ferror (FILE * stream)
如果最近一次读写操作发生错误,ferror( )函数返回一个非零值(表示真),否则返回零值(表示假)。