zoukankan      html  css  js  c++  java
  • CFile转FILE*

    我们每个人编写程序时,都会或多或少的被一些小问题所困扰。这些问题有时就像是谜语,答案也许很简单,但解决的过程却像猜谜一样花时间。我的笨办法是日积月累,下面我介绍CFile如何转FILE*,从问题场景,方法和具体代码等方面写起,希望对大家能有所帮助。

           比如原先有一个程序,其中的文件操作都是用CFile完成的,假定就操作一个文件a.dat,初始化时就用CFile::Open打开了文件,然后各种功能中直接使用这个CFile对象,最后在程序退出时调用CFile::Close关闭文件。现在要增加一个新功能,这个功能封装在DLL中,提供的接口要求参数为C Runtime Library的FILE*,这个DLL不能修改。

           因为初始化时已经用CFile打开了文件,现在用fopen打不开了。因为其他功能都要用CFile,而这个新增功能用FILE*,最好的办法就是将已有的CFile转换成FILE*。(另外的方法是对原先程序进行大改,每个具体功能的实现中自己打开文件,功能结束后关闭文件,取消初始化时的CFile打开文件,这样太繁琐了,并且说不定就把已有功能改坏了)

           CFile转FILE*分为几步,首先从CFile获得Windows的HANDLE(CFile::m_hFile),接着将Windows的HANDLE转换为CRT的HANDLE(_open_osfhandle),最后将CRT的HANDLE打开,得到FILE*(_fdopen),很简单。

           示例代码:

    CFile fin;
    
    fin.Open(“a.dat”,CFile::modeRead);
    
    FILE* f = _fdopen(_open_osfhandle(fin.m_hFile, NULL), "rb");

    参考资料:

    A Handy Guide To Handling Handles(http://www.codeproject.com/KB/files/handles.aspx)
    原文链接:https://blog.csdn.net/ljfth/article/details/3974732

  • 相关阅读:
    docker 如何启动空容器
    dotnet5.0 aspnetcore runtime docker镜像
    abp asp.net core 手动获取容器中的服务
    我把代码写在别人的分支了?别慌,有办法解决
    var重复声明为什么后续声明会被忽略
    flex布局不常用到的属性整理
    微信openID和unionID的区别
    js稀疏数组、密集数组、数组空位、手写数组map方法
    vscode格式化代码换行?试试这个配置
    封装一个公共组件并上传到npm仓库
  • 原文地址:https://www.cnblogs.com/2018shawn/p/12103638.html
Copyright © 2011-2022 走看看