构建文件的绝对路径,然后创建目录和文件的最佳方法是什么?我找到了以下方法。你能复习一下吗,或者提出一些更好的建议?
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编译器。
-
calloc
比malloc
慢,因为它执行零初始化。如果您实际上不需要零初始化,那么就不要使用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;
去掉所有嵌套极大地提高了可读性但是,一旦出现错误,不要忘记清理您分配或打开的任何资源!