我如何保存一个输出文件到它所属的文件夹在c使用MacOs

gzszwxb4  于 2023-11-16  发布在  Mac
关注(0)|答案(2)|浏览(128)

文件当前保存到/Users/benreaby,而我希望它保存到可执行文件的源文件夹

// Filename that I want to save to the source 
// folder that the executable is located in
#define FILENAME "TACmFile.txt" 

int main(int argc, const char * argv[]) {
    fp = fopen(FILENAME, "w");
    fprintf(fp, "hello world");
    fclose(fp);
    return 0;
}

字符串

llycmphe

llycmphe1#

当运行一个可执行文件时,如果使用了相对文件路径,那么TACmFile.txt文件将被写入到运行该可执行文件时的当前工作目录中。这不一定与源代码所在的目录有任何相似之处。
如果你想覆盖它,你需要指定一个 * 绝对 * 路径。你可能需要从配置文件中读取你的可执行文件来获取文件路径信息。

r8uurelv

r8uurelv2#

这里有一个解决方案。它取决于argv[0]中存在的可执行文件路径和文件名。您的代码在这里被修改以添加新函数merge_pf(),该函数使用在argv[0]中找到的可执行文件的路径。它从路径中剥离可执行文件名并将所需的文件名附加到同一路径。这个新字符串可用于打开程序目录中您选择的文件。
这段代码由我测试为win32.路径标记('/')添加了Unix -因此,应该也有工作- * 但没有测试 *.请测试/检查,看看你的操作系统是否支持argv[0]包含程序路径和文件名的关键原则,然后再使用这段代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/* merge_pf() expects path to have exe name, ie: 'F:/dir/program.exe'.
   Param fname is some filename, ie: 'file.txt'
   Example final string would be: 'F:/dir/file.txt'
*/
char *merge_pf(const char *path, const char *fname)
{
    int  iii;
    char *path_file = malloc(strlen(path)+strlen(fname)+1);

    if(path_file)
    {
        strcpy(path_file, path);
        iii=(int)strlen(path_file);
        while(iii--)
        {
            if(path_file[iii]=='\\' || path_file[iii]=='/') /* DOS or Unix path token*/
                break;  /* Stop if we hit the last token */
            path_file[iii]='\0';    /*strip .exe name from path*/
        }
        strcpy(&path_file[iii+1], fname); /* merge path and file name*/
    }
    return path_file;
}

// Filename that I want to save to the source 
// folder that the executable is located in
#define FILENAME "TACmFile.txt" 

int main(int argc, const char *argv[]) 
{
    char *pf = merge_pf(argv[0], FILENAME);
    FILE *fp;

    if(pf)
    {
        printf("Will open: %s\n", pf);
        fp = fopen(pf, "w");
        if(fp)
        {
            fprintf(fp, "hello world");
            fclose(fp);
        }
        free(pf);
    }
    return 0;
}

字符串
测试你的操作系统是否在arv[0]中有程序路径和文件名可能看起来像这样...(可能存在一种更安全的方法):

#include <stdio.h>

int main(int argc, const char *argv[]) 
{
    const char *pf = argv[0];

    if(pf)
    {
        printf("Program Path and File name: %s\n", pf);
    }
    return 0;
}


成功看起来像这样:

Program Path and File name: f:/PROJECTS/32bit/_HELP/C/H118/math.exe

相关问题