若檔案與執行檔位於同一目錄,直接使用檔案名即可:
FILE *fp = fopen("data.txt", "r"); // 相對於當前工作目錄
可呼叫 getcwd() (POSIX) 或 _getcwd() (Windows) 取得當前工作目錄,再自行拼接。
Windows:使用 GetFullPathName 或 PathCanonicalize (Shlwapi.h)。
#include <windows.h>
#include <stdio.h>
void PrintFullPath(LPCSTR filename)
{
char full[MAX_PATH];
DWORD len = GetFullPathNameA(filename, MAX_PATH, full, NULL);
if (len > 0 && len < MAX_PATH)
printf("完整路徑: %s\n", full);
else
printf("路徑過長或檔案不存在\n");
}
Linux/Unix (POSIX):使用 realpath() 解析符號連結並轉為絕對路徑。
#include <stdlib.h>
#include <stdio.h>
#include <limits.h>
void PrintRealPath(const char *filename)
{
char resolved[PATH_MAX];
if (realpath(filename, resolved))
printf("真實路徑: %s\n", resolved);
else
perror("realpath");
}
若需跨平台,可封裝介面,編譯期以巨集切換實作;或使用 Boost.Filesystem / C++17 std::filesystem(C 語言專案可考慮引入輕量級封裝庫)。