[英]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
。
動態分配總是比 static 分配慢。 您可以將所有這些緩沖區換成 static 或本地存儲。
使用printf
系列函數進行字符串處理是不必要的慢。 您似乎僅將它用於字符串連接的目的,但在這種情況下,一個簡單的strcat
可以代替。
然而strcat
和類似的也很慢,因為它們再次遍歷字符串。 將字符串作為輸入后,您可以調用strlen
來了解它們的長度。 從那里您無需再尋找 null 終結器。 例如:
memcpy(&str[length], "\\file.txt", sizeof("\\file.txt"));
(請注意, sizeof 包括字符串文字的 null 終止符,因此它也會被復制。)
這比 stdio.h 膨脹函數和strcat
具有卓越的性能。
MSVC 的各種_s
功能可能會也可能不會遵循 C 標准,並且可能會或可能不會提高安全性。 他們無疑會增加執行開銷,因為為了安全起見,他們需要額外的錯誤檢查。
例如,微軟喜歡檢查每個人和他們的母親是否等於 NULL,這增加了額外的分支作為無意義的膨脹。 因為我可以肯定地告訴他們我的字符串文字不等於 NULL - 實際上它們甚至不是用戶輸入,因此在它們上應用“安全”功能是無稽之談。
我建議放棄任何名為_s
的東西,除非您和 Microsoft 都可以給出明確的理由,確切地說為什么_s
風格會導致您的用例中的安全性提高。
關於最易讀的方法,考慮制作一個 function,它在出錯時立即返回錯誤代碼,例如枚舉。 您不斷增加每次錯誤檢查的嵌套/縮進,這使得代碼更難閱讀。 而是按照以下方式進行:
if (pub_working_dir == NULL) return MYFUNC_ERR_MEMALLOC; ... if (buffer==NULL) return MYFUNC_ERR_GETCWD; ... if (err_fp;=0) return MYFUNC_ERR_FILENOTFOUND;
擺脫所有的嵌套極大地提高了可讀性。 但是,發生錯誤時不要忘記清理您分配或打開的任何資源!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.