今天需要解决一个问题,将影像瓦片(一堆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~


												

C 文件读写 容易疏忽的一个问题的更多相关文章

  1. Python基础-字符串、集合类型、判断、深拷贝与浅拷贝、文件读写

    字符串 1.定义三个变量: 2.交换两个变量值 1)引入第三个变量: 2)Python引入第三方变量: 3)不引入第三方变量: 3. isalpha 是否是汉字或字母 4.Isalnum  是否是汉字 ...

  2. python(三)一个文件读写操作的小程序

    我们要实现一个文件读写操作的小程序 首先我们有一个文件 我们要以"============"为界限,每一个角色分割成一个独立的txt文件,按照分割线走的话是分成 xiaoNa_1. ...

  3. 问题:C#打开一个文本文档往里面写数据,没有就新建文档 ;结果:c#FileStream文件读写(转)

    FileStream对象表示在磁盘或网络路径上指向文件的流.这个类提供了在文件中读写字节的方法,但经常使用StreamReader或 StreamWriter执行这些功能.这是因为FileStream ...

  4. 【Win 10 应用开发】文件读写的三种方案

    本文老周就跟伙伴们探讨一下关于文件读写的方法.总得来说嘛,有三种方案可以用,而且每种方案都各有特色,也说不上哪种较好.反正你得记住老祖宗留给我们的大智慧——事无定法,灵活运用者为上. OK,咱们开始吧 ...

  5. c语言文件读写操作总结

    C语言文件读写操作总结 C语言文件操作 一.标准文件的读写 1.文件的打开 fopen() 文件的打开操作表示将给用户指定的文件在内存分配一个FILE结构区,并将该结构的指针返回给用户程序,以后用户程 ...

  6. ActionScript 3.0入门:Hello World、文件读写、数据存储(SharedObject)、与JS互调

    近期项目中可能要用到Flash存取数据,并与JS互调,所以就看了一下ActionScript 3.0,现把学习结果分享一下,希望对新手有帮助. 目录 ActionScript 3.0简介 Hello ...

  7. Android 文件读写

    一.分类 文件读写作为Android四大数据存储方式之一,又分为内部存储和外部存储两种: (1)内部存储(Internal storage): 总是可用. 文件默认情况存储在/data/data/包名 ...

  8. python基础之文件读写

    python基础之文件读写 本节内容 os模块中文件以及目录的一些方法 文件的操作 目录的操作 1.os模块中文件以及目录的一些方法 python操作文件以及目录可以使用os模块的一些方法如下: 得到 ...

  9. 【Python】[IO编程]文件读写,StringIO和BytesIO,操作文件和目录,序列化

    IO在计算机中指Input/Output,也就是输入和输出. 1.文件读写,1,读文件[使用Python内置函数,open,传入文件名标示符] >>> f = open('/User ...

随机推荐

  1. ARPSpoofing教程(三) - 捕获数据包

    1: #include"pcap.h" 2: //每次捕获到数据包时,libpcap都会自动调用这个回调函数 3: void packet_handler(u_char *para ...

  2. wireshark过滤语法总结-重点偏移过滤

    http://chenjiji.com/post/3371.html 作者: CHAN | 发布: 2013 年 10 月 24 日 做应用识别这一块经常要对应用产生的数据流量进行分析. 抓包采用wi ...

  3. spring boot 框架 启动更新项目,以及生成 "实体_"文件

    1.更新项目 clean  --->  更新项目 ---> package--->refresh 即可.(这几个步骤一个不能够少) 2.项目中的类的依赖关系存在,但是无法导入依赖 m ...

  4. css011 表格和表单的格式化

    css011 表格和表单的格式化 一.    让表格专司其职    Html中创建一个三行三列的表格 <table> <caption align="bottom" ...

  5. WinForm------TreeList加载数据方法

    1.SQLService操作 (1)在SQLServer创建一张表dbo.Department (2)写入以下数据 2.VS操作(这里如何使用EntityFramework加载数据库就不多说了哈) ( ...

  6. MySQL数据库常用函数

    一.数学函数 数学函数主要用于处理数字,包括整型.浮点数等. ABS(x) 返回x的绝对值 不区分大小写 SELECT ABS(-1) -- 返回1 CEIL(x),CEILING(x) 返回大于或等 ...

  7. Runner站立会议08

    会议时间:2016.4.27  21.10~21.25 地点:基教负一层 今天:看日历的代码,网上下的,没有注释 明天:继续看代码 困难:代码看不懂 会议照片: 燃尽图:

  8. 20145212 《Java程序设计》第8周学习总结

    20145212 <Java程序设计>第8周学习总结 教材学习内容总结 第十四章 NIO与NIO2 认识NIO NIO使用频道(Channel)来衔接数据节点,在处理数据时,NIO可以让你 ...

  9. ubuntu亮度调节失效

    ctrl+alt+T 打开终端 输入下面的指令 sudo touch /usr/share/X11/xorg.conf.d/20-intel.conf 2 再输入下面的指令: sudo gedit / ...

  10. linux curl 命令详解,以及实例

    linux curl是一个利用URL规则在命令行下工作的文件传输工具.它支持文件的上传和下载,所以是综合传输工具,但按传统,习惯称url为下载工具. 一,curl命令参数,有好多我没有用过,也不知道翻 ...