許多初學者在使用 C++ 處理檔案輸入輸出時,會對「記事本寫入的數值」產生誤解,以為檔案內容本身帶有進制屬性(如十進制、十六進制)。實際上,記事本(文本檔案)僅儲存字元編碼,不具備數值進制的概念。本文釐清觀念並提供正確讀取與轉換流程。
當你在記事本輸入 10.5 並儲存,檔案實際儲存的是字元 '1'、'0'、'.'、'5' 的 ASCII/UTF-8 編碼位元組,並非記憶體中 float 或 double 的二進制佈局。因此,不存在「十進制轉十六進制」的檔案層面操作。
fscanf、fgets 配合 sscanf,或 C++ 風格的 std::ifstream 讀取文字內容。float/double 變數(此時在記憶體中為二進制浮點數表示)。printf("%a", val) (C99) 或 std::hexfloat (C++11) 輸出 IEEE 754 十六進制浮點數格式;或手動轉換整數部分為十六進制字串。FILE *fp = fopen("data.txt", "r");
if (fp) {
float val;
// 讀取並解析浮點數
if (fscanf(fp, "%f", &val) == 1) {
printf("讀取值: %f\n", val);
// C99 標準:輸出十六進制浮點數格式 (如 0x1.4p+3)
printf("十六進制浮點數: %a\n", val);
}
fclose(fp);
}
#include
#include
#include
std::ifstream fin("data.txt");
float val;
if (fin >> val) {
std::cout << "讀取值: " << val << "\n";
// C++11: 輸出十六進制浮點數
std::cout << "十六進制浮點數: " << std::hexfloat << val << "\n";
}
若檔案是由程式以 fwrite(&val, sizeof(float), 1, fp) 寫入(二進制模式),則讀取時需用 fread 對應結構讀回,不可用記事本開啟查看。此時檔案內容直接對應記憶體位元組,無需解析字串。
記事本儲存的是人類可讀的文字,而非特定進制的數值。處理步驟永遠是:「讀字串 → 轉數值 → 依需求格式化輸出」。釐清這一點,即可避免「無法轉換進制」的困惑。