fopen在Windows下神秘失败

时间:2010-07-18 16:39:18

标签: c windows fopen

也许我只是有另一个黑色但是,这一行给了我很多麻烦:

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

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

我绝对不知道这里发生了什么。也许这是我身上一些疯狂的愚蠢错误,但我不能在Windows下运行这个东西:/

另外,我还有另一个工作正常的程序,数据文件也包含在名为data的子目录中。

修改
为了清楚说明,/ NOR `\ *都不起作用。

编辑2:
好吧,我放弃了这个,也许有人玩得很开心,这里有包含EXE的ZIP,VS的调试数据等。: https://dl.dropbox.com/u/2332843/Leaf.zip

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

7 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:2)

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

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

这就是因为反斜杠是一个特殊字符(因此字符串中的反斜杠是使用\编写的,引号符号是\“,因此使用其他特殊字符)。

答案 2 :(得分:1)

由于此问题仅在Windows上发生。我怀疑该文件是否真的命名为“world.data”。如您所知,Windows的默认设置会隐藏文件扩展名。它的真实名称是world.data.xxx吗?

答案 3 :(得分:0)

在GetCurrentDirectory()中添加一行,以查看您是否从预期的目录运行。

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

答案 4 :(得分:0)

我碰巧遇到了同样的问题,突然间我发现了它。

这应该是你的Windows错误。

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

所以请查看扩展程序。

希望它有所帮助!

答案 5 :(得分:0)

今天我遇到了这个问题,之所以发生这种情况,是因为我在该模式参数上使用了“br”而不是“rb”。

底层的fopen抛出某种异常,只会注册为崩溃。它不需要返回标准的NULL响应或设置相关的错误值。

答案 6 :(得分:-1)

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