文本文件格式:奇數行為 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;
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);
}
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;
}
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;
}
ZQ112101
劉誠明
ZQ112102
劉磊
ZQ112103
劉義峥
...
fgets 讀取整行,保留空格strcspn(line, "\n") 安全移除換行符(兼容 \r\n)strncpy 防止緩衝區溢出,手動保證結束符