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

C語言按行讀取文本文件存入結構體數組並查詢完整實現

     編輯:程式設計綜合問答

需求分析

文本文件格式:奇數行為 ID,偶數行為姓名,交替出現。需讀取到結構體數組,支持按 ID 查詢。

數據結構設計

#define MAX_NAME_LEN 64
#define MAX_ID_LEN 16
#define MAX_STUDENT_NR 100

typedef struct {
    char ID[MAX_ID_LEN];
    char name[MAX_NAME_LEN];
} student_t;

student_t g_student_array[MAX_STUDENT_NR];
int g_count = 0;

核心功能實現

1. 文件讀取與解析

void read_data(const char* filename) {
    FILE* fp = fopen(filename, "r");
    if (!fp) { perror("fopen"); return; }
    
    char line[MAX_ID_LEN > MAX_NAME_LEN ? MAX_ID_LEN : MAX_NAME_LEN];
    int count = 0;
    
    while (count < MAX_STUDENT_NR) {
        // 讀取 ID 行
        if (!fgets(line, sizeof(line), fp)) break;
        line[strcspn(line, "\n")] = '\0';  // 移除換行符
        strncpy(g_student_array[count].ID, line, MAX_ID_LEN - 1);
        
        // 讀取姓名行
        if (!fgets(line, sizeof(line), fp)) break;
        line[strcspn(line, "\n")] = '\0';
        strncpy(g_student_array[count].name, line, MAX_NAME_LEN - 1);
        
        count++;
    }
    
    g_count = count;
    fclose(fp);
}

2. 按 ID 查詢

int find_student_by_id(const char* id) {
    for (int i = 0; i < g_count; i++) {
        if (strcmp(g_student_array[i].ID, id) == 0) {
            printf("ID: %s, Name: %s\n", 
                   g_student_array[i].ID, g_student_array[i].name);
            return 1;
        }
    }
    printf("未找到 ID: %s\n", id);
    return 0;
}

3. 打印所有數據

void print_all() {
    printf("=== 所有學生信息 ===\n");
    for (int i = 0; i < g_count; i++) {
        printf("%d. ID: %-12s  Name: %s\n", 
               i+1, g_student_array[i].ID, g_student_array[i].name);
    }
}

完整主程序

int main(int argc, char** argv) {
    const char* filename = "students.txt";
    const char* search_id = "ZQ112101";
    
    read_data(filename);
    print_all();
    find_student_by_id(search_id);
    
    return 0;
}

測試數據文件 (students.txt)

ZQ112101
劉誠明
ZQ112102
劉磊
ZQ112103
劉義峥
...

關鍵技術點

  1. fgets 讀取整行,保留空格
  2. strcspn(line, "\n") 安全移除換行符(兼容 \r\n)
  3. strncpy 防止緩衝區溢出,手動保證結束符
  4. 錯誤處理:檢查文件打開、讀取返回值
  5. 全局數組簡化演示,實際項目建議動態分配或傳遞上下文

擴展建議

  • 使用動態數組(realloc)支持任意數量數據
  • 建立哈希表(ID 為鍵)實現 O(1) 查詢
  • 支持模糊搜索(姓名拼音/首字母)
  • 添加文件修改監控自動重載
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved