c-建立文件绝对路径的最佳方式



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

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);
}
}
}
}

EDIT:我正在寻找最快、可读性最强的方法,用于在Windows上使用Visual Studio 2022编译器。

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

  • callocmalloc慢,因为它执行零初始化。如果您实际上不需要零初始化,那么就不要使用calloc

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

  • 使用printf函数族进行字符串处理是不必要的缓慢。您似乎只将其用于字符串连接,但在这种情况下,简单的strcat会起作用。

  • 然而,strcat和类似的代码也很慢,因为它们再次遍历字符串。将字符串作为输入后,可以调用strlen来学习它们的长度。从那时起,您就不需要再寻找空终止符了。例如:

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

    (请注意,sizeof包含字符串文字的null终止符,因此它也会被复制。(
    这比stdio.h bloat函数和strcat具有更高的性能。

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

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

    我建议放弃任何名为_s的东西,除非您和Microsoft都能给出一个明确的理由,确切地说明为什么_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;
    

    去掉所有嵌套极大地提高了可读性但是,一旦出现错误,不要忘记清理您分配或打开的任何资源!

最新更新