zoukankan      html  css  js  c++  java
  • C 文件读写 容易疏忽的一个问题

      今天需要解决一个问题,将影像瓦片(一堆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 else 26 continue; 27 }

    这段代码有没有错误?  或许你一眼就看出来了,可是当局者迷,当时我调试很久才发现,具体错误后面再说。

    先总结一个技巧:如何获取文件大小?


    这里介绍几种办法:

    1、通过fseek函数:

    fseek(fp,0,SEEK_END);
    size_t size = ftell(fp);

    2、使用_stat()函数,需要包含头文件<sysstat.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~

    
    
    
    
    
    
    
    
  • 相关阅读:
    taro 填坑之路(一)taro 项目回顾
    Redux遵循的三个原则是什么?
    解释一下 Flux
    MVC框架的主要问题是什么?
    与 ES5 相比,React 的 ES6 语法有何不同?
    你了解 Virtual DOM 吗?解释一下它的工作原理
    DOM 事件有哪些阶段?谈谈对事件代理的理解
    CSS:用Less实现栅格系统
    .NET:国际化和本地化
    自定义工作流 之 模型设计与实现
  • 原文地址:https://www.cnblogs.com/bigbigtree/p/3487044.html
Copyright © 2011-2022 走看看