最近在看FFmpeg的有关知识,由于经常遇到文件读写,但是对于C语言的文件读写又有些忘记,于是便好好的记录一下C语言的文件读写,同时也让自己能够不再对C语言的文件读写感到陌生(其实就是重新复习一下C语言相关的文件读写的相关的API).
常用的文件读写函数如下:
1 | FILE * fopen(const char* restrict filename,const char* restrict mode); |
fopen()函数需要一个文件路径,和文件打开模式,常用的打开模式如下:
如果发生错误,会将错误码设置在erron变量,并返回一个NULL。
fclose()是关闭打开的文件指针,包括清空内部缓存数据,在关闭错误时返回EOF,否则返回0.
fflush()函数是刷新文件指针,清空与输出或更新数据流参数相关的任何缓冲区。如果发生错误函数返回EOF,否则返回0
freopen()是重新打开数据流,就像先调用fclose关闭文件,然后调用fopen打开文件,成功时返回输入数据流与输入的数据流相关,失败返回NULL.
文件定向:
1 | int fseek(FILE *restrict stream,long int offset,int wherefrom); |
fseek随机访问打开的stream,第二个参数是打开位置,wherefrom是定位方式,表示从文件哪个点开始测量offset,如果定位成功返回0,负责返回下一个非0值。然后清除任何文件结尾指示符。其中wherefrom的值以及含义如下:
SEEK_SET或0 距离文件开头offset个字符
SEEK_CUR或1 距离文件当前位置offset个字符
SEEK_END或2 距离文件末尾offset个字符
ftell函数对于二进制返回当前文件位置之前的字节数,如果失败返回-1.对于文本文件,返回的值是由实现定义的。
rewind函数则是将数据流复位到文件开头。调用rewind(stream)等价于:
fseek(stream,0,SEEK_SET);
读取文本文件的函数有:
1 | char *fgets(char *s,int n,FILE *stream); |
写入文本文件的函数有:
1 | int fputc(int c,FILE *stream); |
读写二进制的函数有:
1 | size_t fread(void *restrict ptr,size_t element_size,size_t count,FILE *restrict stream); |
fread和fwrite分别是输入和输出到二进制文件。stream是输入输出流ptr是指向count元素数组的指针,每个元素是element_size 字符长。fread返回实际读取的项目数,如遇到末尾,则这个数小于count,遇到错误返回0,使用feof或ferror判断是文件末尾还是错误,如果element_size和count为0,不传输数据。
重命名及文件
1 | int rename(const char *oldname,const char *newname); |
两个函数操作成功均返回0,否则返回非0值