1.1标准IO的文件操作函数
1.1.1fopen
头文件:#include
函数原型:FILE *fopen(const char *path, constchar *mode);
函数功能:打开一个文件path,获取到此文件的文件流指针
文件流指针:FILE*
typedef struct file_buf{
int fd;
char buf[size];
} FILE ;
形参列表:
path:要打开文件流指针的文件
mode:操作方式
r :只读(不能创建文件)
r+ :读写(覆盖写,不能创建文件)
w :只写(清空写,可以创建文件)
w+ :读写(清空写,可以创建文件)
a :只写(追加写,可以创建文件)
a+ :读写(追加写,可以创建文件)
返回值:
成功:文件流指针
失败:NULL
新创建的文件,权限默认为0666
1.1.2fclose
函数原型:int fclose(FILE*fp);
函数功能:关闭fp文件流指针
形参列表:
fp:要关闭的文件流指针
返回值:
成功:0
失败:EOF
1.1.3fprintf
函数原型:int fprintf(FILE*stream, const char *format, ...);
函数功能:往stream文件流指针,按照constchar *format格式写入数据
形参列表:
stream:要写入的文件流指针
const char *format:格式控制,与printf用法一致
返回值:
成功:字节数
失败:负数
和printf用法基本一致,printf是往终端输出数据,而fprintf是往stream写入数据,如果stream文件流指针指向stdout,那么跟printf一样的效果
1.1.4fscanf
函数原型:int fscanf(FILE*stream, const char *format, ...);
函数功能:从stream文件流指针指向的文件中,获取const char *format格式的数据
形参列表:
stream:需要获取数据的文件流指针
const char *format:要获取的数据格式
返回值:
成功:字节数
失败:EOF
和scanf用法基本一致,scanf是从终端获取数据,而fscanf是从stream获取数据,如果stream指向stdin,那么跟scanf一样的效果
1.1.5fgets
函数原型:char *fgets(char*s, int size, FILE *stream);
函数功能:从stream指向的文件中,获取size个字符,存储到s缓存区中
形参列表:
s :存储获取到的数据的缓存区
size :获取个数
stream :文件流指针
返回值:
成功:缓存区的指针
失败:NULL
和gets用法基本一致,gets是从终端获取数据,而fgets是从stream获取数据,如果stream指向stdin,那么跟gets一样的效果
1.1.6fputs
函数原型:int fputs(constchar *s, FILE *stream);
函数功能:往stream文件流指针指向的文件输出s缓存区中的数据
形参列表:
s:要输出的数据缓存区
stream:要输出的对象文件流指针
返回值:
成功:非负数
失败:EOF
和puts用法基本一致,puts是从终端获取数据,而fputs是从stream获取数据,如果stream指向stdout,那么跟puts一样的效果,唯一的区别在于puts会自动加上换行符,而fputs不会自动加上。
1.1.7fread
函数原型:size_tfread(void *ptr, size_t size, size_t nmemb, FILE *stream);
函数功能:从stream文件流指针指向的文件中,读取size*nmemb个字节数据,存储到ptr指向的缓存区中
形参列表:
ptr:存储数据的缓存区
size:一块数据的字节大小
nmemb:块数,有多少块size大小的数据
stream:需要读取数据的文件流指针(数据来源)
返回值:
成功:读取到的块数,不够一块的不算一块
失败/文件末尾:0
例如:fread(buf,100, 5, fp);
fread函数,可以读取到回车,不会因为回车而停止读取,也不会因为空格而停止读取
1.1.8fwrite
函数原型:size_tfwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
函数功能:往stream文件流指针指向的文件中,写入size*nmemb个字节的数据,数据来源是ptr指针指向的缓存区
形参列表:
ptr:指向要写入的数据来源的指针
size:一块数据的字节大小
nmemb:块数,有多少块size大小的数据
stream:指向对象文件的文件流指针
返回值:
成功:写入的块数
失败:0
例如:fwrite(buf,100, 5, fp);
fwite函数从ptr指向的缓存区中获取数据写入到stream中,遇到回车或者空格,不会停止从ptr中获取数据,形参要求获取多少个字节,就获取多少个字节,如果ptr指向的缓存区中数据不够,fwite会从ptr后越界往下获取数据,写入到stream中
1.1.9fseek
函数原型:int fseek(FILE*stream, long offset, int whence);
函数功能:把文件偏移指针,从whence基准点,偏移offset个字节单位
形参列表:
stream:文件流指针
offset:偏移的单位量
whence:偏移的基准点
SEEK_SET:文件开头
SEEK_CUR:偏移指针当前位置
SEEK_END:文件末尾
返回值:
成功:0
失败:-1
fseek函数与lseek函数区别在于返回值
1.1.10ftell
函数原型:long ftell(FILE*stream);
函数功能:返回文件偏移指针与文件开头的距离
形参列表:
stream:文件流指针
返回值:
成功:文件偏移指针当前偏移量,也就是文件偏移指针与文件开头的距离
失败:-1
1.1.11rewind
函数原型:void rewind(FILE*stream);
函数功能:把文件偏移指针,指向文件开头
形参列表:
stream:文件流指针
返回值:无
rewind(fp)== fseek(fp,0,SEEK_SET);