首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C++ 讀取記事本浮點數並轉換進制的正確方法

     編輯:程式設計疑難解答

許多初學者在使用 C++ 處理檔案輸入輸出時,會對「記事本寫入的數值」產生誤解,以為檔案內容本身帶有進制屬性(如十進制、十六進制)。實際上,記事本(文本檔案)僅儲存字元編碼,不具備數值進制的概念。本文釐清觀念並提供正確讀取與轉換流程。

核心誤區:文本檔案 ≠ 二進制數值

當你在記事本輸入 10.5 並儲存,檔案實際儲存的是字元 '1'、'0'、'.'、'5' 的 ASCII/UTF-8 編碼位元組,並非記憶體中 float 或 double 的二進制佈局。因此,不存在「十進制轉十六進制」的檔案層面操作。

正確流程:讀取 → 解析 → 轉換輸出

  1. 讀取字串:使用 fscanf、fgets 配合 sscanf,或 C++ 風格的 std::ifstream 讀取文字內容。
  2. 解析為數值:由字串轉換為 float/double 變數(此時在記憶體中為二進制浮點數表示)。
  3. 格式化輸出:若需以十六進制顯示,使用 printf("%a", val) (C99) 或 std::hexfloat (C++11) 輸出 IEEE 754 十六進制浮點數格式;或手動轉換整數部分為十六進制字串。

程式碼範例 (C 風格)

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);
}

程式碼範例 (C++ 風格)

#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 對應結構讀回,不可用記事本開啟查看。此時檔案內容直接對應記憶體位元組,無需解析字串。

總結

記事本儲存的是人類可讀的文字,而非特定進制的數值。處理步驟永遠是:「讀字串 → 轉數值 → 依需求格式化輸出」。釐清這一點,即可避免「無法轉換進制」的困惑。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved