在项目内打开特定文件而无需知道工作目录是什么的方法

问题描述

我遇到了许多语言的问题,最近一次是C ++。

示例问题

假设我们正在使用C ++,并且具有以下项目文件结构:
("Project" main folder with three [modules,data,etc] subfolders)

现在说:

  1. 我们的maincode.cpp位于 Project 文件
  2. moduleA.cpp modules 文件夹中
  3. data.txt data 文件夹中
  4. moduleA.cpp要阅读data.txt

所以我目前的方式是假设 maincode.cpp Project 文件夹中进行编译和执行,然后 hardcode data/data.txt中的路径moduleA.cpp进行读取(例如我使用fstream fs("data/data.txt")进行读取)。
但是如果由于某种原因该代码etc文件夹中执行怎么办?
有办法解决吗?

问题

  1. 这是一个有效的问题吗?还是我缺少wd(工作目录)概念基础知识?
  2. 是否有解决绝对路径方法,以便在C ++中解决此问题?
  3. 有没有通用的方法来使用任何语言?
  4. 如果没有合理的方法,您将如何处理此问题?

如果我错过了问题图示的任何重要细节,请发表评论

解决方法

在某些时候,程序必须假设文件在哪里。通过从用户输入获取它,或者通过带有假定文件名的相对路径获取它。正如评论中已经说过的那样,C ++最近在C ++ 17中添加了std::filesystem,可以帮助您制作与主机文件系统交互的跨平台代码。

话虽这么说,每个程序,无论大小,都必须在某些时候做出某些假设,如果程序要求它们以特定名称位于某个位置,则删除或移动某些文件对于任何程序都是有问题的。除了向用户显示错误消息等之外,这是无法解决的。

,

如果您知道程序始终相对于可执行文件,或者您使用诸如“ C:\ myProgram \ data \ data.txt”之类的绝对路径,则您的程序可以从主调用中的argv[0]推导出路径。 。 第二种方法适用于每种语言。

,

正如@Hatted Rooster所说,在不作某些假设的情况下,通常无法解决某些任意文件,但是有些框架允许您将某些文件“存储”在可执行文件(或其他文件)中。这些框架通常允许您以不透明的方式处理此类文件,而无需依赖当前的工作目录或相对路径。

例如,请参见the Qt Resource System