从网上查找fopen()函数的用法,各种翻译,参差不齐(对错参半),还是自己翻译一遍,记录下来,更靠谱。
参考链接:
http://www.tutorialspoint.com/c_standard_library/c_function_fopen.htm
http://www.cplusplus.com/reference/cstdio/fopen/
FILE *fopen(const char *filename, const char *mode) 主要用于通过制定的mode打开filename,这是C库的函数。
mode | Access |
"r" | read,文件必须存在,打开读取数据。文件不存在,则读取失败。 |
“w” | write,文件不存在,则创建文件,然后写入。 文件存在,则清空内容,然后写入。 |
“a” | append,写操作,文件不存在,则创建,然后写入。文件存在,则直接在结尾续写内容。 |
“r+” | read/update, 文件必须存在,打开文件,更新读取或写入。 |
“w+” | write/update, 文件不存在,则创建新的文件,更新读取或写入。文件存在,则清除数据,更新读取或写入。 |
“a+” | append/update, 文件不存在,则创建。文件存在,则直接读取或追加。追加操作包括:在新数据写入文件之前移除EOF标记, 写入之后,EOF标记不会还原。 |
研究上面的内容,主要是为了解决缓存被挤爆的问题。
例如:工程中,需要把截屏视频保存在.yuv文件中。数据先存入缓存,缓存大小有限,只能缓存一部分,写入一部分,清空缓存,再继续写入。然而,fopen() 有一个问题:如果不关闭一下 outfile 文件,则数据一直在缓存里,直到缓存被占满,再也写不进数据。所以当数据堆积到一定程度时,就fclose()一下文件,然后再打开,以追加的方式填写数据。ps: b 表示二进制形式读写。
// 以下是伪代码,勿喷
int main()
{
// 先创建并打开文件
FILE *fp_yuv=fopen("output.yuv","wb+");
for(int i = 0; i < limit; ++i)
{
// 此处省略好多行代码
// 写入
fwrite(pFrameYUV->data[0],1,y_size,fp_yuv); //Y
fwrite(pFrameYUV->data[1],1,y_size/4,fp_yuv); //U
fwrite(pFrameYUV->data[2],1,y_size/4,fp_yuv); //V
if(i%20 == 0) // 够一定数量时
{
fclose(fp_yuv);
fp_yuv=fopen("output.yuv","ab+"); // 以追加的方式,打开文件
}
}
fclose(fp_yuv);
return 0;
}