一个fopen失败的原因

    fopen("path//file_name", "r")中当路径和文件名都存在时,就能正常打开。但今天遇到一个很令人纠结的问题,我写的程序在启动时自动载入文件,fopen没有问题,双击列表控件LIST可以重新载入不同的文件,也没有出现问题,可是再调用过GetOpenFileName(Windows打开文件窗口)打开一个文件之后,再调用fopen就会报错。

    难道是Windows API函数GetOpenFileName和标准C语言函数fopen发生冲突吗?

    把代码反复看啊改啊弄了一个多小时,也没有去掉这个BUG,没有办法了只好在网上疯狂搜索,苍天不负有心人啊,终于让我找到了问题的根本所在。

    原来,是GetOpenFileName(LPOPENFILENAME Ipofn)函数的参数在搞鬼!

    LPOPENFILENAME 中的LP是“长指针”的意思,OPENFILENAME是一个保存文件路径等信息的结构体。

    我程序中的代码是这样子的:

OPENFILENAME ofn;

ofn.Flags=OFN_EXPLORER|OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST|OFN_ALLOWMULTISELECT; 

    不难看出这几个OFN_XXX分别表示“浏览”“路径必须存在”“文件必须存在”“允许选择多个文件”

    注意了,问题就出在这个地方!

    Windows还定义了一个OFN_NOCHANGEDIR,它的意思是“不改变当前路径”,如果不加上这个标志,在调用过GetOpenFileName函数之后,就有可能出现fopen打开文件不成功的现象。

    比如你想用fopen("record.txt", "r")来打开当前路径下的record.txt文件,而你先用GetOpenFileName函数打开的是其他路径里的某个文件,而这时系统的当前路径被更改为其他路径,当你再使用fopen的时候,打不开了吧。

    当然,如果fopen是这么写的:

fopen("C://MyTXT//record.txt","r")因为写的是绝对路径,虽然系统的当前路径因调用GetOpenFileName被更改,仍然能成功打开。

 

    一句话总结,加上OFN_NOCHANGEDIR是有好处的!

    参考文章:http://topic.okbase.net/200609/2006091815/2692594.html

  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值