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是有好处的!