今天需要解决一个问题,将影像瓦片(一堆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. Python基本数据类型之set

    一.定义 set是一个无序且不重复的元素集合. 集合对象是一组无序排列的可哈希的值,集合成员可以做字典中的键.集合支持用in和not in操作符检查成员,由len()内建函数得到集合的基数(大小), ...

  2. POJ 1330 Nearest Common Ancestors (最近公共祖先LCA + 详解博客)

    LCA问题的tarjan解法模板 LCA问题 详细 1.二叉搜索树上找两个节点LCA public int query(Node t, Node u, Node v) { int left = u.v ...

  3. 安装和使用Linux花生壳(公网版)

    一.安装说明 1.下载相应的安装包,安装程序 2.运行程序.配置程序(默认使用/etc/phlinux.conf,如果不存在这个文件则自动进入交互配置) [root@localhost -]# phd ...

  4. javascript应用之如何判断一个数为素数

    判断是否为素数? 质数(prime number)又称素数,有无限个.质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数的数称为质数. 合数,数学用语,英文名为Composite numb ...

  5. JQuery------$.getJSON()方法的使用

    html(../Home/Index.cshtml) <body> <button class="Btn">按钮</button> </b ...

  6. aircrack-ng test

    Aircrack-ng工具包有很多工具,我用到的工具主要有以下几个: airmon-ng 处理网卡工作模式 airodump-ng 抓包 aircrack-ng 破解 aireplay-ng 发包,干 ...

  7. centos 查看是32位还是64位

    查看linux机器是32位还是64位的方法: file /sbin/init 或者 file /bin/ls/sbin/init: ELF 64-bit LSB executable, x86-64, ...

  8. delphi---控件使用

    1.TBitBtn控件 属性:Glyph,指定要显示的位图:    Layout ,设置位图在按钮的位置:Kind,要想用自设位图,这个属性要设置bkCustom; 2.TTreeView TTree ...

  9. ecshop登录

    邮箱登录 a.找到function login(){} ,增加一个邮箱判断is_mail()  , b.如果通过,增读取出username , c.再通过默认的login功能 1.需要修改文件incl ...

  10. 捕获EF提交异常

    try { } catch (DbEntityValidationException dbex) { string errMsg = string.Empty; foreach (var eve in ...