簡體   English   中英

構建文件絕對路徑的最佳方法

[英]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 編譯器的最快和最易讀的方法。

  • callocmalloc慢,因為它執行零初始化。 如果您實際上不需要零初始化,則不要使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM