C 语言fseek. ftell调用失败(fseek返回非零值,ftell返回-1)


太长不看版

  • fseek调用失败,返回非零值,是因为传入的参数超过了文件尾,或者文件大于2G,需要使用fseek的64 bit版本_fseeki64.

  • ftell调用失败,返回-1,唯一一次遇到是因为文件大于2G,需要使用ftell的64bit版本,_ftelli64.

BUG重现

size_t offset = 0;
size_t file_data_size = 0,pos_start = 0,pos_end = 0;
unsigned char * buffer = NULL;
pos_start = ftell(fp);//此处正常
fseek(fp, 0L, SEEK_END);
pos_end = ftell(fp);//此处返回一个很大的值
file_data_size = pos_end - pos_start;buffer = new unsigned char[file_data_size];

错误分析

  1. pos_start和pos_end此处应该是long。
  2. 文件大小超过了2G,应该使用64 bit的版本。

修改后

size_t offset = 0;
__int64 file_data_size = 0,pos_start = 0,pos_end = 0;
unsigned char * buffer = NULL;pos_start = 0;
rnt_value = _fseeki64(fp, 0L, SEEK_END);
pos_end = _ftelli64(fp);
if (pos_end != -1 && pos_start != -1)
{file_data_size = pos_end - pos_start;
}
else
{std::cout << "error: fseek error\t" << __FILE__ << __LINE__ << std::endl;return false;
}
buffer = new unsigned char[file_data_size];_fseeki64(fp, pos_start, SEEK_SET);
fread(buffer, sizeof(unsigned char), file_data_size, fp);

修改分析

  1. pos应该定义为int64,而不是其他任何类型。
  2. 使用fseek和ftell的64 bit版本。

fseek与ftell


参考:C标准库,P249, P250

C 语言fseek, ftell调用失败(fseek返回非零值,ftell返回-1)相关推荐

  1. C语言的文件随机访问fseek()和ftell()函数

    C语言的文件随机访问fseek()和ftell()函数 我们要讨论3个问题:fseek()和ftell()函数的工作原理.如何使用二进制流.如何让程序可移植. fseek()与ftell()的工作原理 ...

  2. c语言ftell的作用,C语言的文件随机访问fseek()和ftell()函数

    http://blog.csdn.net/libing403/article/details/73158972 我们要讨论3个问题:fseek()和ftell()函数的工作原理.如何使用二进制流.如何 ...

  3. C语言中连续调用rand函数,返回值不变

    C语言中连续调用rand函数,返回值不变 最近用C语言随机函数编程发现了一个奇怪的现象: 简易版代码: #include<stdio.h> #include<stdlib.h> ...

  4. java+fseek+函数_函数fseek() 用法(转)

    在阅读代码时,遇到了很早之前用过的fseek(),很久没有用了,有点陌生,写出来以便下次查阅. 函数功能是把文件指针指向文件的开头,需要包含头文件stdio.h fseek 函数名: fseek 功 ...

  5. C 语言中可以调用命令行指令的 system()函数

    C语言有一个system函数(在<stdlib.h>头中,C++则为<cstdlib>头),可以用来调用终端命令.原型如下: int system(const char *cm ...

  6. Lua与C语言的互相调用

    本系列相关文章: Flutter 热更新及动态UI生成 Lua 15分钟快速上手(上) Lua 15分钟快速上手(下) Lua与C语言的互相调用 LuaDardo中Dart与Lua的相互调用 Lua底 ...

  7. D语言与C语言的互相调用

    很多语言都可以实现与C语言的互相调用,但我觉得D语言做的更好些,D与C的兼容是二进制兼容,不是在源码上的兼容,也就是说编译手的二进制文件是可以互相链接的.废话不多说,直接上例子 一.在D语言中调用C函 ...

  8. 【C 语言】C 项目开发代码规范 ( 形参合法性判断 | 函数返回值局部变量 | 函数中不用全局变量 | 函数中使用局部变量接收形参 | 函数返回值 | 形参作返回值 | 形参返回值处理 )

    文章目录 一.C 项目开发代码规范 一.C 项目开发代码规范 上一篇博客 [C 语言]字符串模型 ( 键值对模型 ) 中 , 完成了字符串的 键值对 查找功能 , 代码不太规范 ; C 项目开发代码规 ...

  9. c 调用易语言dll字节集,总结VC与易语言DLL互相调用的方法

    在编写程序的时候往往需要调用到别的语言编写的DLL文件,下面先来看一下在易语言中如何调用VC编写的DLL呢,首先用VC编写一个简单的DLL文件,代码如下: int WINAPI add(int x,i ...

最新文章

  1. 慎重选型:PG还是MySQL?Uber的案例不能作为参考!
  2. ABAP:BAPI_ACC_DOCUMENT_POST扩展字段
  3. SQL基础【十、Delete】
  4. aws 数据库迁移_AWS Loft的数据库周
  5. 中国企业人工智能应用之道——从“浅尝试”到“规模化”.pdf(附下载链接)...
  6. 前端组件化和模块化最大的区别是什么_7招提升你的前端开发效率
  7. Frequentist 观点和 Bayesian 观点
  8. linux 让程序在后台执行
  9. gms2游戏移植linux,GMS卡刷包制作
  10. Navivat 中快速快捷查找表和数据
  11. 图片自适应手机横屏竖屏的宽高
  12. 计算机软件著作权登记证书
  13. Linux ubuntu 20.04安装unrar
  14. 一文搞懂候选码、主码、全码、外码、主属性、主键、主关键字、非主属性清晰总结
  15. Hackthebox靶场连接
  16. html+php内联执行JavaScript是报错
  17. echarts 数据区域缩放
  18. HTML文档中注释标记作用,html的注释有什么作用
  19. 大一大学计算机导论论文,大学计算机导论论文3500字_大学计算机导论毕业论文范文模板.doc...
  20. 获国际评级机构认可,波司登或为国产羽绒服树立参考“样本”

热门文章

  1. SAP的统驭科目 - 什么是SAP的统驭科目
  2. H.264/AVC标准参考软件 JM
  3. process-on在线绘制架构图,xmind绘制思维导图
  4. Opencv:如何调用IP摄像头
  5. Docker定制化Python基础镜像
  6. 等额本金和等额本息两种贷款方式的比较
  7. 盘古开源解析:物联网时代的芯片产业新趋势
  8. linux 查看java进城_linux查看java进程|线程池信息
  9. 技术分享 | 基于 Alertmanager 告警系统的改造
  10. 微信十周年,张小龙回答一切!2小时演讲,1.6万字完整版实录