【问题标题】:C++ fopen relative PathC++ fopen 相对路径
【发布时间】:2014-07-06 14:42:22
【问题描述】:

我阅读了一些关于相对路径的主题,但我还是弄错了。 我希望某人可以帮助我:)。 我正在使用 Visual Studio 2013,Windows 7

我有以下目录:

这是我的 .exe 文件 D:\uni\c++\ex5\msvc2013\ex5\Debug

这是我要阅读的文件 D:\uni\c++\ex5\res\thehead.raw

打开文件的代码:

FILE* f;
f = fopen("..\\..\\..\\res\\thehead.raw", "rb");
if (f == NULL)
printf("FAIL!!");

因为我需要使用相对路径,所以我发现它如下: ..\ 进入父目录。

所以“..\..\..\”应该让我进入文件夹“D:\uni\c++\ex5\”。

\res 应该打开 res 犯规。

不用说它失败了,我不知道为什么。 任何帮助将不胜感激。

【问题讨论】:

  • 错误码是什么
  • 程序的启动位置和起始工作目录不一定相同。
  • 查找术语“当前工作目录”。相对路径是相对于这个目录的。
  • 使用strerror 打印errno 的值可能会有所帮助。虽然fopen 不需要设置errno,但许多实现都会这样做。
  • @KäptnFreiversuch 尝试打印当前工作目录:stackoverflow.com/questions/143174/…

标签: c++ windows


【解决方案1】:

相对路径是相对于当前工作目录的,而不是可执行文件的路径。当前工作目录是您启动程序的目录。

要将路径视为相对于可执行文件的位置,最简单的可移植选项是以argv[0] 访问可执行文件,解压缩目录,然后将chdir() 放入其中。请注意,这仅在程序本身以完整路径名启动时才有效。

【讨论】:

  • 在Windows下通常使用GetModuleFilename,为hModule传递0,因为argv[0]在各种情况下可能不正确。
  • 感谢您的帮助。我用 printf("%s", _fullpath(NULL, path, 40));显然我要去一个目录到高。 "..\\..\\res\\thehead.raw";而不是 "..\\..\\..\\res\\thehead.raw" 现在可以正常工作。感谢您的帮助
  • 您好,感谢您的帮助。 “相对路径是相对于当前工作目录,而不是可执行文件的路径”——这在我的 (Windows) 系统上似乎确实如此。但这有标准保证吗?或者这是否容易在不同的机器上表现不同?
  • @AvivCohn 在类 Unix 系统上肯定也是如此,尽管相对路径和绝对路径的语法不同。 (例如,c:\xyz 在 Windows 上是绝对路径,而在 Unix 上是相对路径。)C 和 C++ 在语言标准中都没有工作目录的概念,因此它们都不提供任何保证。
  • the simplest option is to access the executable as argv[0], extract the directory, and chdir() into it. 这并不总是正确的。 argv[0] 是在 shell 中输入的内容,不一定是程序的真实路径。见link
【解决方案2】:

@Käptn 对代码进行了一些修改,由于遇到了一些警告,我发现以下方法有效,尽管我使用的是 C 驱动器而不是 D 驱动器,因为我的系统没有 D 驱动器。实际上,以下代码的工作方式相同,并且我的系统将显示我添加的“文件已打开”消息。我发现无论是通过调试器运行,还是直接从 Debug 文件夹中的可执行文件执行,这都是一样的。

路径

Here is my .exe file C:\uni\c++\ex5\msvc2013\ex5\Debug    
Here is the file i want to read C:\uni\c++\ex5\res\thehead.raw

源代码

#include <iostream>

int main (int argc, char ** argv)
{
    FILE* f;
    fopen_s(&f, "..\\..\\..\\res\\thehead.raw", "rb");
    if (f == NULL)
    {
        printf("FAIL!!");
    }
    else
    {
        printf("File opened.");
    }
    return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多