构建文件绝对路径的最佳方式

Best way to build absolute path to file

提问人:SerTet 提问时间:9/27/2022 最后编辑:SerTet 更新时间:9/27/2022 访问量:66

问:

生成文件的绝对路径,然后创建目录和文件的最佳方法是什么?我找到了以下方法。 你能审查一下,或者提出更好的建议吗?

char *pub_working_dir, *pub_results_dir, *pub_path_file;

pub_working_dir=(char *)calloc(256, sizeof(char));

if (pub_working_dir) buffer=_getcwd(pub_working_dir, 256);

if (buffer!=NULL) 
{
    pub_results_dir=(char *)calloc(256, sizeof(char));
    if (pub_results_dir)
    {
        sprintf_s(pub_results_dir, 256, "%s\\results", pub_working_dir);
        _mkdir(pub_results_dir);
        pub_path_file=(char *)calloc(256, sizeof(char));
        if (pub_path_file)
        {
            sprintf_s(pub_path_file, 256, "%s\\file.txt", pub_results_dir);
            FILE *file;
            int err_fp = fopen_s(&file, pub_path_file, "a");
            if (err_fp==0) 
            {
                // write to the file
                fclose(file);
            }
        }
    }
}

编辑:我正在寻找最快、最易读的方法,旨在在 Windows 上使用 Visual Studio 2022 编译器。

C 字符串 IO

评论

1赞 Lundin 9/27/2022
您需要定义“最佳”。最快、内存最少、可读性最强、最便携、最安全,什么?此外,由于您使用的是非标准函数,因此您需要指定此代码的编译器和操作系统。
0赞 SerTet 9/27/2022
@Lundin,我在问题中添加了细节。
0赞 William Pursell 9/27/2022
256似乎是一个相当随机选择的值。您可能更喜欢PATH_MAX(来自 limits.h)
0赞 SerTet 9/27/2022
@WilliamPursell,在我的极限中没有。也许来自 stdlib.hPATH_MAX_MAX_PATH
0赞 William Pursell 9/27/2022
@SerTet stackoverflow.com/questions/9449241/... (叹气)

答:

1赞 Lundin 9/27/2022 #1

我正在寻找用于在 Windows 上使用 Visual Studio 2022 编译器的最快、最易读的方法。

  • calloc比执行零初始化慢。如果实际上不需要零初始化,则不要使用 .malloccalloc

  • 动态分配总是比静态分配慢。您可以将所有这些缓冲区换成静态或本地存储。

  • 使用一系列函数进行字符串处理是不必要的缓慢。您似乎仅将其用于字符串连接的目的,但在这种情况下,简单就可以了。printfstrcat

  • 但是,类似的东西也很慢,因为它们会再次遍历字符串。将字符串作为输入后,您可以调用以了解它们的长度。从那时起,您就不需要再次寻找空终止符了。例如:strcatstrlen

    memcpy(&str[length], "\\file.txt", sizeof("\\file.txt"));

    (请注意,sizeof 包含字符串文本的 null 终止符,因此它也会被复制。
    这比 stdio.h 膨胀函数以及 .
    strcat

  • MSVC 的各种功能可能遵循也可能不遵循 C 标准,并且可能会也可能不会提高安全性。毫无疑问,他们所做的是增加执行开销,因为为了安全起见,他们需要额外的错误检查。_s

    例如,Microsoft喜欢检查每个人和他们的母亲是否等于NULL,这会增加额外的分支作为毫无意义的膨胀。因为我可以肯定地告诉他们,我的字符串文字不等于 NULL - 事实上,它们甚至不是用户输入,所以对它们应用“安全”函数是无稽之谈。

    我建议删除任何调用,除非您和 Microsoft 都能给出明确的理由,确切说明为什么这种风格会导致您的用例中安全性提高。_s_s

  • 关于最易读的方法,请考虑创建一个函数,该函数在出错时立即返回错误代码,例如枚举。您不断增加每次错误检查的嵌套/缩进,这使得代码更难阅读。相反,请按照以下方式执行:

    if (pub_working_dir == NULL)
       return MYFUNC_ERR_MEMALLOC;
    ...
    if (buffer==NULL) 
       return MYFUNC_ERR_GETCWD;
    ...
    if (err_fp!=0) 
       return MYFUNC_ERR_FILENOTFOUND;
    

    彻底摆脱所有嵌套有助于提高可读性。但是,如果出现错误,请不要忘记清理您分配或打开的任何资源!