1:fopen()
fopen()函数主要用于对文件和终端的输入输出。但是如果要对设备的行为进行更为明确的行为控制,那最好使用底层系统调用,因为这样可以避免库函数带来的一些非预期的潜在副作用。
函数原型:
#include <stdio.h>
FILE *fopen(const char *filename, const char *mode);
filaname:指定的文件名,fopen会把它与一个文件流关联起来。
mode:指定文件的打开方式
返回值:成功时返回一个FILE*指针,失败返回NULL值,NULL定义在stdio.h中。
mode参数如下所示:
"r"/"rb":只读方式打开
"w"/"wb":只写方式打开,把文件长度截为0(你可把它想象为>)
"a"/"ab":只写方式打开,新内容追加到文件尾(你可以想象成>>)
"r+"/"r+b"/"rb+":以修改方式打开(读写)
"w+"/"w+b"/"wb+":以修改方式打开,同时把文件内容截为0
"a+"/"a+b"/"ab+":以修改方式打开,新内容追加到文件结尾
linux会把所有文件都看成是二进制文件,所以那个"b"表示文件是二进制。
2:fread()函数
fread()函数的主要作用是从一个文件流里读取数据,数据从stream读到由ptr指定的数据缓冲区里面。
函数原型:
#include <stdio.h>
size_t fread(void *ptr, size_t size, size_t nitems, FILE *stream);
ptr:数据读到ptr指定的缓冲区里面。
size:每个数据记录的长度(类似与char,int,long,float之类,指代每次读取块的大小)
nitems:传输的记录个数
stream:指定要读取的数据缓冲区
返回值:读到缓冲区的记录个数(非字节),如果读到文件尾,其返回值可能小于nitems,甚至可以是0(读取文件为空)。
3:fwrite()函数
fwrite()函数从stream获取数据记录写到ptr中,返回值是成功写入的记录个数。
函数原型:
#include <stdio.h>
size_t fwrite(const void *ptr, size_t size, size_t items, FILE *stream);
它的接口和fread很像,参考fread。
4:fclose()函数
fclose()函数关闭指定的文件刘stream,使所有未写出的内容全部写出。
函数原型:
#include <stdio.h>
int fclose(FILE *stream);
stream:指定要关闭的文件流stream
返回值:如果成功返回0,失败返回EOF,同时会向全局变量errorn写入错误信息码。
5:fflush()函数
fflush()函数的主要作用是把文件流的所有未写出的内容立刻写出。
函数原型:
#include <stdio.h>
int fflush(FILE *stream);
接口同fclose.
6:fseek()函数
fseek()函数主要作用是在文件流里面为下一次读写指定位置。
函数原型:
#include <stdio.h>
int fseek(FILE *stream, long int offset, int whence);
stream:指定操作的文件流
offset:指定位置
whence:指定偏移方式,具体形式类似系统调用lseek。
返回值:成功返回0,失败返回-1,同时设置errno指出错误。
7:fgetc,getc,getchar函数
fgetc()从文件流取出下一个字节并把它作为一个字符返回,如果到达文件结尾或者出现错误的时候返回EOF。其中getchar()从标准输入读取数据。
函数原型:
#include <stdio.h>
int fgetc(FILE *stream);
int getc(FILE *stream);
int getchar();
8:fputc,putc,putchar函数
fputc()函数把一个字符写道一个输出文件流中。如果成功返回写入的值,失败则返回EOF。其中puchar()函数将单个字符写道标准输出。
#include <stdio.h>
int fputc(int c, FILE *stream);
int putc(int c, FILE *stream);
int putchar();
9:fgets()和gets()函数
fgets()函数从输入文件流stream读取一个字符串,并把读到的字符写到ptr指向的缓冲区,当遇到如下情况停止:遇到换行符,已经传输n-1个字符,或者到达文件尾。它会把遇到的换行符也传递到接收字符串里去,再加上一个表示结尾的空字节\0。
gets()函数从标准输入读取数据并丢弃遇到的换行符,它在接受字符串的尾部加上NULL。
函数原型:
#include <stdio.h>
char *fgets(char *ptr, int n, FILE *stream);
char *gets(char *ptr);
10:printf,fprintf,sprintf函数
printf系列函数能够对各种不同类型的参数进行格式化编排和输出。
printf函数把自己的输出送到标准输出;
fprintf函数把自己的输出送到一个指定的文件流;
sprintf函数把自己的输出和一个结尾空字符写到s指向的缓冲区。
函数原型:
#include <stdio.h>
int printf(const char *format, ...);
int sprintf(char *s, const char *format, ...);
int fprintf(FILE *stream, const char *format, ...);
format:指定输出的格式;
s:字符串缓冲区
stream:指定的文件流
11:scanf,fscanf和sscanf函数
scanf系列函数从一个文件流读取数据并写到指定地址的变量。
scanf函数将读入的值保存在对应的变量里;
函数原型:
#include <stdio.h>
int scanf(const char *format, ...);
int fscanf(FILE *stream, const char *format, ...);
int ssacnf(const char *s, const char *format, ...);
12:文件流错误
通过检查文件流的状态来确定是否发生错误;
ferror函数测试一个文件流的错误标识,如果被设置返回一个非0值,否则返回0.
feof函数测试一个文件流的文件尾标识,如果被设置就返回一个非0值,否则返回0.
clearerr函数清楚有stream指定的文件流的文件尾标识和错误标识。
函数原型:
#include <stdio.h>
int ferror(FILE *stream);
int feof(FILE *stream);
void clearerr(FILE *stream);
13:文件流和文件描述符
每个文件流都有一个底层描述符相关联。
fileno函数可以确定文件流使用那个底层描述符;
fdopen函数在一个已经打开的文件描述符上创建一个新的文件流。
函数原型:
#include <stdio.h>
int fileno(FILE *stream);
FILE *fdopen(int fildes, const char *mode);