C 文件读写 容易疏忽的一个问题
来源:互联网 发布:ubuntu文件大小怎么看 编辑:程序博客网 时间:2024/05/16 07:43
今天需要解决一个问题,将影像瓦片(一堆jpg文件)分别进行读取,并将所有数据以文件流的方式存入一个.db的文件中,
同时将每个jpg数据在db文件中的位置保存下来,作为index存在.idx文件中。
其中部分代码如下(没有copy fopen和fclose的部分):
1 char buf[256];
for (int i = 0; i < levels; i++) 2 for (int x = 0; x < imageLevels[i][0]; x++)//纵向 3 for (int y = 0; y < imageLevels[i][1]; y++)//横向 4 { 5 jpgpath = info.tilespath +CPLSPrintf("image\\pyramid\\level%d\\x%03d_y%03d.jpg",i,x,y); 6 if ((fp = fopen(jpgpath,"rb")) != NULL)//jpg file pointer 7 { 8 while((hr = fread(buf,sizeof(char),256,fp)) != 0) 9 {10 fwrite(buf,sizeof(char),256,fdb);11 }12 fseek(fp,0,SEEK_END);13 14 //seek到文件结尾 将该位置tell出来 即为文件大小15 fwrite(&jpgIndex,sizeof(jpgIndex),1,fidx);16 //fprintf(fidx,"%I64d",jpgIndex);17 jpgIndex = jpgIndex + ftell(fp);18 fclose(fp);19 20 // struct _stat finfo;21 // _stat(jpgpath,&finfo);22 // int s = finfo.st_size;23 // int ls=9;24 }25 else26 continue;27 }
这段代码有没有错误? 或许你一眼就看出来了,可是当局者迷,当时我调试很久才发现,具体错误后面再说。
先总结一个技巧:如何获取文件大小?
这里介绍几种办法:
1、通过fseek函数:
fseek(fp,0,SEEK_END);size_t size = ftell(fp);
2、使用_stat()函数,需要包含头文件<sys\stat.h>
1 struct _stat finfo;2 _stat(jpgpath,&finfo);3 int s = finfo.st_size;
3、利用filelength函数
1 FILE* file = fopen(filepath, "rb"); 2 if (file) 3 { 4 int size = filelength(fileno(file)); 5 fclose(file); 6 }
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, 0, OPEN_EXISTING, 0, 0); if (handle != INVALID_HANDLE_VALUE) { int size = GetFileSize(handle, NULL); CloseHandle(handle); }
个人比较偏爱前两种方法。
好了 ,该说说我的错误了。看看的第一段代码的第十行,第三个参数。懂了吧,其实是很简单的错误,但是体现出我对于函数变量的了解和控制能力欠缺火候。
fwrite(buf,sizeof(char),hr,fdb);
问题虽然很小,但是编程的时候,很多问题和这种类似,我是用二进制文件查看写出来的文件很久之后,才发现位置有偏移。
开始我怀疑是windows写入时候做了优化,将文件偏移到每个block的开头位置,可是我的结果文件只有一个.db文件,不应该会被优化。
后来才发现自己的疏忽,mark~
0 0
- C 文件读写 容易疏忽的一个问题
- struts2上传文件容易疏忽的地方
- validate校验容易疏忽的问题
- Linuxl下C编程系列--C语言(容易疏忽的问题)l
- 一个疏忽导致的问题
- 容易疏忽的问题:CComVariant.ReadFromStream失败时的处理
- LINQ to EF容易疏忽的几个小问题
- 一些容易疏忽的地方
- 因为一个调用疏忽引发的问题
- JAVA基础容易疏忽的知识点总结
- 在web开发领域容易被疏忽的18个关键问题-George Fekete
- c语言文件读写的一个例子
- Python读写文件的一个问题
- 【C】文件读写问题
- 一个容易忽略的问题
- 一个容易出错的问题
- HDU 1005 疏忽了一个问题!
- 单双引号的区别,defined容易疏忽的小地方
- MySQL Python教程(4)
- 【SDOI2012】【BZOJ2705】【Longge的问题】【题解】【数论】
- mysql python image 图像存储读取
- mongodb
- C/C++多种方法获取文件大小(转)
- C 文件读写 容易疏忽的一个问题
- 代码大全 表驱动法
- C\C++ sizeof 陷阱&&总结
- landsat 8 卫星 波段介绍 及组合
- jQuery Mobile高手必备的十大技巧和代码片段
- 设计模式之代理(Proxy)模式
- I have released my first ios app appclient in appstore,any questions, pls follow your information
- C++编程练习——2014/3/14
- 35+ 个免费下载的 HTML5/CSS3 下拉菜单