读yuv文件的时候需要获取yuv文件的帧数,以便建立循环一帧一帧读取,这时候要获取yuv的帧数。
方法:首先用fopen函数打开一个yuv文件,接着用fseek( fYUV, 0L, SEEK_END ),再接着用ftell来获取文件的大小size,由于用的是yuv420,因此用size/(WIDTH*HEIGHT*1.5)即获得了yuv文件的总帧数。
需要注意的是:fseek函数已把指向yuv文件的开始的指针改变了位置,即此时的指针已指向文件的结尾处,由于接着要进行文件的读写,这时候应该用rewind()函数把指针直接重新指到文件开始处。
ps:获得文件大小的几种方法
#include <io.h>
#include <sys/stat.h>
#include <afx.h>
#define _AFXDLL
using namespace std;
void main()
{
// 此文件在工程打开状态下为不可访问
char* filepath = "..//test.ncb" ;
// 方法一
struct _stat info;
_stat(filepath, & info);
int size = info.st_size;
cout<<size<< endl;
// 方法二
FILE* file = fopen(filepath, "rb" );
if (file)
{
int size = filelength(fileno(file));
cout<<size<< endl;
fclose(file);
}
// 方法三
CFile cfile;
if (cfile.Open(filepath, CFile::modeRead))
{
int size = cfile.GetLength();
cout<<size<< endl;
}
// 方法四
HANDLE handle = CreateFile(filepath, FILE_READ_EA, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0 );
if (handle != INVALID_HANDLE_VALUE)
{
int size = GetFileSize(handle, NULL);
cout<<size<< endl;
CloseHandle(handle);
}
}
VS2005:若编译链接不通过,需要修改工程设置:
(1) Configuration Properties -> C/C++ -> Code Generation -> Runtime Library, 选择"Multi-threaded Debug(/MTd)"
(2) Configuration Properties -> Linker -> Input -> Ignore Specific Library, 输入"msvcprtd.lib"
例子中,由于在工程打开状态下,test.ncb文件无法打开,所以方法二、三无法获取文件大小,因此推荐使用方法一、四。
另:文件的随机读写
前面介绍了对文件的顺序读写操作,这些操作都是从文件的第一个有效数据(或某个位置)开始的,依照数据在文件存储设备中的先后次序进行读写,在读写过程中,文件位置指针自动移动。但在实际应用中,往往需要对文件中某个特定位置处的数据进行处理,换言之,就是读完一个字节的内容后,并不一定要读写其后续的字节数据,可能会强制性地将文件位置指针移动到用户所希望的特定位置,读取该位置上的数据,这就是随机读写文件。
C语言提供了对文件的随机读写功能。在随机方式下,系统并不按数据在文件中的物理顺序进行读写,而是可以读取文件任何有效位置上的数据,也可以将数据写入到任意有效的位置。
C语言通过提供文件定位函数来实现随机读写功能。
1. 获取文件位置指针当前值的函数ftell()
ftell()函数的功能是获得并返回文件位置指针的当前值。ftell()函数的原型定义为:
long ftell(FILE * fp);
其中参数fp是文件型指针,指向当前操作的文件。
rewind()