Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何访问路径中的上一个文件夹?_C - Fatal编程技术网

C 如何访问路径中的上一个文件夹?

C 如何访问路径中的上一个文件夹?,c,C,如何告诉程序在上一个目录中查找文件夹 我试过写“./assets/fonts/DejaVuSans.ttf”,但那不起作用 font = TTF_OpenFont ( "assets/fonts/DejaVuSans.ttf", 24 ); 我的资产文件夹不在当前目录中,而是在上一个目录中(稍后我将尝试展开) 您正在使用的SDL2_ttf的ttf_OpenFont库需要绝对路径,而不是相对路径。这很奇怪,因为几乎在其他任何地方,open都会采用相对路径(“../assests/fonts/de

如何告诉程序在上一个目录中查找文件夹

我试过写“./assets/fonts/DejaVuSans.ttf”,但那不起作用

font = TTF_OpenFont ( "assets/fonts/DejaVuSans.ttf", 24 );
我的资产文件夹不在当前目录中,而是在上一个目录中(稍后我将尝试展开)

您正在使用的SDL2_ttf的ttf_OpenFont库需要绝对路径,而不是相对路径。这很奇怪,因为几乎在其他任何地方,open都会采用相对路径(“../assests/fonts/devussans.ttf”)而不是绝对路径(“/home/me/Project/SDL2_thing/assets/fonts/devussans.ttf”)

假设您的程序运行在“/home/me/Project/SDL2\u thing/source/my\u program”这样的目录中。要获取父目录(SDL2_thing)并构建绝对路径,此代码段应该可以工作(基于POSIX函数,缓冲区大小有点杂乱):

#包括//printf
#include//getcwd
#包括//dirname
int main(){
字符缓冲区[1024];
字符目标[2048];
//获取当前工作目录的完整路径
getcwd(缓冲区,1024);
printf(“cwd\t:%s\n”,缓冲区);
//这将有效地切掉路径末尾的目录(执行../source)
dirname(缓冲区);
printf(“父\t:%s\n”,缓冲区);
//按照我们拥有的路径“../SDL2\u thing”构建一个字符串,将其余的字符串追加到后面
sprintf(目标,“%s/assets/fonts/devusans.ttf”,缓冲区);
printf(“目标\t:%s\n”,目标);
返回0;
}
这是一个完整的程序,您可以轻松编译和运行,以查看中间值的输出。再一次,我只是在几个大的缓冲区周围乱跑,这是草率的,应该避免。使用适当的MAX_路径常数等。您应该能够对此进行调整,以获得字体的绝对路径,并提供给TTF_OpenFont()

检查TTF_OpenFont()调用的结果。如果为null,则打印TTF_GetError()提供的字符串。这将有助于确定错误的位置

如果您尝试此解决方案并遇到问题,请对此答案进行评论

当我有机会的时候,我会研究为什么这个函数不接受绝对值,如果没有修正的话,至少试着把它记录下来

简短版本(稍后我将尝试展开)

您正在使用的SDL2_ttf的ttf_OpenFont库需要绝对路径,而不是相对路径。这很奇怪,因为几乎在其他任何地方,open都会采用相对路径(“../assests/fonts/devussans.ttf”)而不是绝对路径(“/home/me/Project/SDL2_thing/assets/fonts/devussans.ttf”)

假设您的程序运行在“/home/me/Project/SDL2\u thing/source/my\u program”这样的目录中。要获取父目录(SDL2_thing)并构建绝对路径,此代码段应该可以工作(基于POSIX函数,缓冲区大小有点杂乱):

#包括//printf
#include//getcwd
#包括//dirname
int main(){
字符缓冲区[1024];
字符目标[2048];
//获取当前工作目录的完整路径
getcwd(缓冲区,1024);
printf(“cwd\t:%s\n”,缓冲区);
//这将有效地切掉路径末尾的目录(执行../source)
dirname(缓冲区);
printf(“父\t:%s\n”,缓冲区);
//按照我们拥有的路径“../SDL2\u thing”构建一个字符串,将其余的字符串追加到后面
sprintf(目标,“%s/assets/fonts/devusans.ttf”,缓冲区);
printf(“目标\t:%s\n”,目标);
返回0;
}
这是一个完整的程序,您可以轻松编译和运行,以查看中间值的输出。再一次,我只是在几个大的缓冲区周围乱跑,这是草率的,应该避免。使用适当的MAX_路径常数等。您应该能够对此进行调整,以获得字体的绝对路径,并提供给TTF_OpenFont()

检查TTF_OpenFont()调用的结果。如果为null,则打印TTF_GetError()提供的字符串。这将有助于确定错误的位置

如果您尝试此解决方案并遇到问题,请对此答案进行评论


当我有机会的时候,我会研究为什么这个函数不接受绝对值,如果没有修正的话,至少试着把它记录下来

试试/。/assets/font/DejaVuSans。ttf@StrahinjaRodic不,那不行。它与“assets/fonts/DejaVuSans.ttf”和“assets”文件夹在同一目录下工作。你说的“previous directory”是什么意思?您的程序是否在我的父目录中使用了
chdir()
?@JonathanLeffler我有一个包含.c文件的“源”文件夹。此外,此父目录还包含一个“资产”文件夹。我需要程序的路径(在“源”文件夹中)返回父目录并搜索“资产”文件夹。不,我没有使用chdir()。稍微澄清一下术语可能会有所帮助。除非您使用的是
chdir
或类似的工具,否则没有“先前目录”的概念。听起来你的意思是“父目录”,即包含当前目录的目录。将此父目录称为“p”(例如),程序的当前工作方向为“p/source”。您可以使用路径(文件名w/directories)“../assets/filename”或“../assets/fonts/devusans.ttf”Try/。/assets/fonts/devusans.ttf”打开“p/assets”中的文件。ttf@StrahinjaRodic,不,那不起作用,它和“assets/fonts/DejaVuSans.ttf”和“assets”文件夹位于同一目录中。您所说的“previous directory”是什么意思?您的程序是否使用
chdir()
?@JonathanLeffler在我的父目录中我有一个带有.c文件的“source”文件夹。此外,此父目录包含一个“assets”文件夹。我需要程序的路径(位于“source”文件夹中)返回父目录并搜索“assets”文件夹。不,我没有使用chdir()。一些术语说明可能会有所帮助。除非您使用
chdir
或类似工具,否则没有“previous directory”的概念。它是这样的
#include <stdio.h>   //printf
#include <unistd.h>  //getcwd
#include <libgen.h>  //dirname

int main() {

        char buffer[1024];
        char target[2048];

        //get the full path to the current working directory
        getcwd(buffer, 1024);
        printf("cwd\t: %s \n", buffer);
        // This will chop off the directory at the end of the path (doing ../source) effectively)
        dirname(buffer);
        printf("parent\t: %s \n", buffer);

        //Take the path we have ".../SDL2_thing" and build a string appending the rest
        sprintf(target, "%s/assets/fonts/DejeVuSans.ttf", buffer);
        printf("target\t: %s \n", target);

        return 0;
}