今天需要解决一个问题,将影像瓦片(一堆jpg文件)分别进行读取,并将所有数据以文件流的方式存入一个.db的文件中,
同时将每个jpg数据在db文件中的位置保存下来,作为index存在.idx文件中。
其中部分代码如下(没有copy fopen和fclose的部分):
char buf[256];
for (int i = ; i < levels; i++)
for (int x = ; x < imageLevels[i][]; x++)//纵向
for (int y = ; y < imageLevels[i][]; y++)//横向
{
jpgpath = info.tilespath +CPLSPrintf("image\\pyramid\\level%d\\x%03d_y%03d.jpg",i,x,y);
if ((fp = fopen(jpgpath,"rb")) != NULL)//jpg file pointer
{
while((hr = fread(buf,sizeof(char),,fp)) != )
{
fwrite(buf,sizeof(char),256,fdb);
}
fseek(fp,,SEEK_END); //seek到文件结尾 将该位置tell出来 即为文件大小
fwrite(&jpgIndex,sizeof(jpgIndex),,fidx);
//fprintf(fidx,"%I64d",jpgIndex);
jpgIndex = jpgIndex + ftell(fp);
fclose(fp); // struct _stat finfo;
// _stat(jpgpath,&finfo);
// int s = finfo.st_size;
// int ls=9;
}
else
continue;
}
这段代码有没有错误? 或许你一眼就看出来了,可是当局者迷,当时我调试很久才发现,具体错误后面再说。
先总结一个技巧:如何获取文件大小?
这里介绍几种办法:
1、通过fseek函数:
fseek(fp,,SEEK_END);
size_t size = ftell(fp);
2、使用_stat()函数,需要包含头文件<sys\stat.h>
struct _stat finfo;
_stat(jpgpath,&finfo);
int s = finfo.st_size;
3、利用filelength函数
FILE* file = fopen(filepath, "rb");
if (file)
{
int size = filelength(fileno(file));
fclose(file);
}
4、利用CFile类的函数
CFile cfile;
if (cfile.Open(filepath, CFile::modeRead))
{
int size = cfile.GetLength();
}
5、利用句柄和CreateFile函数
HANDLE handle = CreateFile(filepath, FILE_READ_EA, FILE_SHARE_READ, , OPEN_EXISTING, , );
if (handle != INVALID_HANDLE_VALUE)
{
int size = GetFileSize(handle, NULL);
CloseHandle(handle);
}
个人比较偏爱前两种方法。
好了 ,该说说我的错误了。看看的第一段代码的第十行,第三个参数。懂了吧,其实是很简单的错误,但是体现出我对于函数变量的了解和控制能力欠缺火候。
fwrite(buf,sizeof(char),hr,fdb);
问题虽然很小,但是编程的时候,很多问题和这种类似,我是用二进制文件查看写出来的文件很久之后,才发现位置有偏移。
开始我怀疑是windows写入时候做了优化,将文件偏移到每个block的开头位置,可是我的结果文件只有一个.db文件,不应该会被优化。
后来才发现自己的疏忽,mark~