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

C 語言文件讀取排序輸出:行數統計、動態分配、qsort 完整流程

     編輯:程式設計綜合問答

需求分析

文件前 3 行為文本描述,其後每行一條數據記錄。需讀取數據部分,排序後輸出。

標準處理流程

  1. 第一遍掃描:統計行數 使用 `fgets` 逐行讀取,跳過前 3 行,計數有效數據行 `N`。
  2. 動態分配數組 `Record *arr = malloc(N * sizeof(Record));`
  3. 第二遍掃描:讀入數據 `rewind(fp)` 或重新打開,再次跳過 3 行,解析每行填充結構體數組。
  4. 排序 `qsort(arr, N, sizeof(Record), cmp_func);`
  5. 輸出結果 遍歷數組打印。
  6. 釋放內存 `free(arr);`

代碼骨架


typedef struct { int id; double value; /* 其他字段 */ } Record;

int cmp(const void *a, const void *b) {
    Record *ra = (Record*)a, *rb = (Record*)b;
    return (ra->value > rb->value) - (ra->value < rb->value);
}

int main() {
    FILE *fp = fopen("data.txt", "r");
    if (!fp) return 1;
    char line[256];
    // 跳過 3 行
    for (int i=0; i<3 && fgets(line, sizeof(line), fp); i++);
    // 統計行數
    int n = 0;
    while (fgets(line, sizeof(line), fp)) n++;
    // 分配
    Record *arr = malloc(n * sizeof(Record));
    // 重讀
    rewind(fp);
    for (int i=0; i<3 && fgets(line, sizeof(line), fp); i++);
    for (int i=0; i

關鍵點

  • 兩次掃描避免動態擴容開銷,適合內存受限環境。
  • `fgets` 保留換行符,`sscanf` 解析靈活,比 `fscanf` 更健壯(可處理行格式錯誤)。
  • 大文件可改用外部排序(分塊排序 + 歸併),但題目規模通常適合內存排序。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved