提问人:SerTet 提问时间:9/27/2022 最后编辑:SerTet 更新时间:9/27/2022 访问量:66
构建文件绝对路径的最佳方式
Best way to build absolute path to file
问:
生成文件的绝对路径,然后创建目录和文件的最佳方法是什么?我找到了以下方法。 你能审查一下,或者提出更好的建议吗?
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 编译器。
答:
我正在寻找用于在 Windows 上使用 Visual Studio 2022 编译器的最快、最易读的方法。
calloc
比执行零初始化慢。如果实际上不需要零初始化,则不要使用 .malloc
calloc
动态分配总是比静态分配慢。您可以将所有这些缓冲区换成静态或本地存储。
使用一系列函数进行字符串处理是不必要的缓慢。您似乎仅将其用于字符串连接的目的,但在这种情况下,简单就可以了。
printf
strcat
但是,类似的东西也很慢,因为它们会再次遍历字符串。将字符串作为输入后,您可以调用以了解它们的长度。从那时起,您就不需要再次寻找空终止符了。例如:
strcat
strlen
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;
彻底摆脱所有嵌套有助于提高可读性。但是,如果出现错误,请不要忘记清理您分配或打开的任何资源!
评论
256
似乎是一个相当随机选择的值。您可能更喜欢PATH_MAX(来自 limits.h)PATH_MAX
_MAX_PATH