首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C語言電話號碼管理系統:文件操作與控制台界面完整實現

     編輯:關於C語言

系統功能概覽

基於 VC++ 6.0 開發的控制台電話號碼管理系統,支援新增、修改、刪除、查詢(姓名/電話)、顯示全部、文件清理等功能,數據持久化存儲於二進制文件 telefon.dat。

核心數據結構

struct fileh {          // 文件頭:記錄總條數
    long fc;
} fh;

struct telsys {         // 記錄結構:姓名、地址、電話
    char usename[30];
    char useadd[50];
    long usetel;
} tel[200];             // 最大 200 條記錄

文件存儲格式

  • 文件開頭:struct fileh(4/8 位元組),存儲當前記錄數 fc。
  • 緊隨其後:fc 個 struct telsys 連續存儲,每筆固定大小。
  • 讀寫均通過 fseek 定位 + fread/fwrite 實現隨機存取。

關鍵功能模塊解析

文件清理 qingli()

將內存中有效記錄重寫回文件,消除刪除殘留的「垃圾數據」,壓縮文件體積。

void qingli() {
    FILE *f;
    long i = 0;
    // 1. 讀取所有有效記錄到內存 tel[]
    f = fopen("telefon.dat", "rb");
    fread(&fh, sizeof(fh), 1, f);
    while (i < fh.fc) {
        fseek(f, sizeof(fh) + i * sizeof(struct telsys), SEEK_SET);
        fread(&tel[i], sizeof(struct telsys), 1, f);
        i++;
    }
    fclose(f);
    // 2. 以 wb+ 截斷重寫
    f = fopen("telefon.dat", "wb+");
    i = 0;
    while (i < fh.fc) {
        fseek(f, 0, SEEK_SET);
        fwrite(&fh, sizeof(fh), 1, f);
        fseek(f, sizeof(fh) + i * sizeof(struct telsys), SEEK_SET);
        fwrite(&tel[i], sizeof(struct telsys), 1, f);
        i++;
    }
    fclose(f);
}

新增記錄 addnew()

  • 檢查 fh.fc < 200 容量上限。
  • 輸入驗證:電話號碼限定 4000000~4999999。
  • 寫入流程:更新 fh.fc → 寫文件頭 → 寫新記錄。

刪除記錄 del()

  • 顯示列表 → 輸入序號 → 後續記錄前移覆蓋 → fh.fc-- → 重寫文件頭與後續記錄。
  • 注意:刪除後未調用 qingli(),文件中仍殘留舊數據,佔用空間。

查詢功能 findname() / findtel()

  • 讀取全部記錄到內存 tel[](fread(&tel, fh.fc*sizeof(...), 1, f))。
  • 遍歷比對,格式化輸出匹配項(箱形字符繪製表格)。

修改記錄 edit()

  • 按序號定位,直接覆寫 tel[in-1] 並 fseek 寫回對應文件位置。

顯示全部 display()

  • 分頁顯示:每 10 條暫停 getch() 等待按鍵。
  • 使用箱形字符繪製美觀表格邊框。

主選單與程序入口

void main() {
    FILE *f = fopen("telefon.dat", "ab");  // 確保文件存在
    fclose(f);
    char ch;
    do {
        system("cls");
        // 打印選單...
        ch = getch();
        switch (ch) {
            case '1': addnew(); break;
            case '2': edit(); break;
            case '3': del(); break;
            case '4': findtel(); break;
            case '5': findname(); break;
            case '6': display(); getch(); break;
            case '7': quit(); break;
        }
    } while (ch != '7');
}

代碼審計與改進建議

問題風險建議
gets/scanf("%s") 無長度限制緩衝區溢出使用 fgets 或 scanf("%29s") 限制長度
全域陣列 tel[200] 固定大小擴展性差動態分配 malloc/realloc 或鏈表
刪除不壓縮文件,退出才 qingli()文件膨脹、碎片化刪除後即時重寫或引入標記刪除+定期整理
system("cls")、gotoxy 平台相關不可移植抽象界面層,使用 ncurses/Windows API
無輸入錯誤恢復(如非數字輸入)程序進入死循環檢查 scanf 返回值,清理輸入緩衝區
電話號碼用 long 存儲不支援前導零、分機、國際格式改用 char[20] 字符串存儲

總結

本系統展示了 C 語言結構化程式設計、二進制文件隨機存取、控制台 UI 繪製的經典範式。雖代碼風格屬早期教學級(全域變量、固定陣列、平台依賴),但邏輯完整、功能齊全,是理解文件操作與菜單驅動程式架構的優秀案例。現代化重構可引入模塊化設計、動態內存、跨平台庫與輸入驗證機制。

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