Fopen在Windows下神秘失败

也许我只是又一次黑了,但是这一行给了我很多麻烦:

FILE *fp = fopen("data/world.data", "rb"); 

在使用GCC编译时,这在Linux下工作正常。 但是,当我用Visual Studio编译它,它崩溃。 fp总是NULL 。 BIN和EXE都在完全相同的目录中。 现在,为了让事情变得更疯狂,当我在Linux下使用Wine运行EXE时,它…工作正常

我绝对没有一个该死的线索是怎么回事。 也许这是一个疯狂的愚蠢的错误在我身边,但我不能得到这个东西在Windows下运行:/

此外,我有另一个程序工作得很好,那里的数据文件也包含在一个名为数据的子目录。

编辑
为了说明两者都不是/ NOR` \ *就行了。

编辑2:
好吧,我已经放弃了,也许有人试图找出它的乐趣,这里是包含EXE的ZIP,debugging数据VS等:
https://dl.dropbox.com/u/2332843/Leaf.zip

编辑3:
用CodeBlocks和MinGW编译它就像一个魅力。 猜猜它必须做一些MSVC或VS中的项目设置。

这听起来像是当你运行程序时, data不是你当前目录的子目录。 默认情况下(对于x86目标),VS将从您为项目创建的基目录的DEBUG或RELEASE子目录构建并运行程序。 你可以修改当前运行的目录(例如VS 2008的项目|属性|配置属性|调试)。

编辑:虽然Windows要求您在命令行中使用反斜杠作为目录分隔符,但正斜杠在代码中正常工作 – 这不是问题的根源。

在Windows中,您必须编写以下内容:

 FILE *fp = fopen("data\\world.data", "rb"); 

这就是这样,因为反斜杠是一个特殊的字符(所以一个字符串中的反斜杠是用\和一个引号符号“\”,所以与其他特殊字符)。

由于这个问题只发生在Windows上。 我怀疑文件是否真的名为“world.data”。 如您所知,Windows的默认设置隐藏文件扩展名。 它的真名是world.data.xxx?

包括一行GetCurrentDirectory(),以查看您是否从您所期望的目录运行。

当我在Visual Studio上用C#/ C ++开发时,通常我会从debug文件夹中运行它。 如果在.net中使用正斜杠代替反斜杠,我认为不重要。

我遇到了同样的问题,突然间我发现了这个问题。

这应该是你的Windows错误。

比方说, FILE *fp = fopen("data/world.data", "rb"); 在Windows中,如果你隐藏扩展名,那么你可以看到文件data / world.data,但实际上它可能是/data/world.dat.txt或者有些。

所以请检查扩展名。

希望能帮助到你!

我今天碰到了这个,碰巧是因为我在这个模式参数上使用了“br”而不是“rb”。

底层的fopen正在抛出某种类型的异常,这只会导致崩溃。 这并不麻烦返回标准的NULL响应或设置相关的错误值。

我不确定,但可能是因为你在路径中使用斜杠而不是(转义的)反斜杠?