【C 语言】文件操作 ( 学生管理系统 | 插入数据 | 查询数据 | 删除数据 )
生活随笔
收集整理的這篇文章主要介紹了
【C 语言】文件操作 ( 学生管理系统 | 插入数据 | 查询数据 | 删除数据 )
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 一、學生管理系統
- 1、插入數據
- 2、查詢數據
- 3、刪除數據
- 二、完整代碼
一、學生管理系統
實現一個簡易學生管理系統 , 驗證文件操作 ;
1、插入數據
從命令行接收數據 , 放入結構體成員中 , 最后將結構體數據寫出到內存中 ;
/** 插入學生數據*/ int insert() {// 要寫入文件的結構體struct student s1 = {0};// 打開要寫入的文件FILE *p = fopen("student.dat", "w");// 打開失敗直接退出if(p == NULL)return 0;while (1){// 提示輸入學生名字printf("input student's name:\n");// 阻塞等待命令行中用戶輸入學生名字scanf("%s", s1.name);// 如果用戶輸入 quit , 則退出循環 , 保存文件if(strcmp(s1.name, "quit")==0)break;// 提示輸入某個學生的年齡printf("input %s's age:\n", s1.name);// 命令行阻塞等待用戶輸入學生年齡scanf("%d", &s1.age);// 將結構體寫出到文件中fwrite(&s1, 1, sizeof (struct student), p);}// 關閉文件fclose(p);return 0; }2、查詢數據
從命令行中輸入要查詢的學生信息 , 如果查詢全部學生信息 , 則傳入 “all” ;
循環從文件中讀取單個結構體信息 , 逐個遍歷結構體的 name 成員 , 查詢是否是要查詢的學生姓名 ; 如果是則打印該數據 ;
/** 查詢學生數據*/ int query() {// 緩存信息用的結構體struct student s = { 0 };// 要查詢的數組char name[30] = { 0 };// 提示輸入要查詢的學生名字printf("input student's name:");// name 數組接收控制臺輸入的字符串scanf("%s", name);// 打開文件FILE *p = fopen("student.dat", "r");// 文件打開失敗退出if (p == NULL)return 0;// 使用該變量記錄是否查詢到學生信息int status = 0;// 循環讀取 student 結構體數據// 每次都可以讀取到一個學生數據// 判斷該數據是否是要查詢的學生數據while(1){// 從文件中讀取一個結構體大小的數據fread(&s, 1, sizeof(struct student), p);// 判斷是否讀取到文件末尾, 注意 feof 必須在文件操作之后才能調用if (feof(p))break;// 如果學生名字是 all , 則打印所有學生信息if (strcmp(name, "all") == 0){// 打印學生信息printf("name=%s, age=%d\n", s.name, s.age);// 標記信息找到status = 1;}else{// 對比本次讀取的學生信息是否是要查詢的信息if (strcmp(name, s.name) == 0){// 打印要查詢的學生信息printf("name=%s, age=%d\n", s.name, s.age);// 標記信息找到status = 1;}}}// 關閉文件fclose(p);// 如果學生信息沒有找到, 打印提示信息if (status == 0)printf("student %s not found\n", name);return 0; }3、刪除數據
將所有的學生數據一次性全部讀取出來 ;
然后逐個遍歷 , 使用 結構體指針 , 逐個遍歷上述全部數據 ;
遍歷的同時 , 寫出數據 , 如果學生的名字不是要刪除的名字 , 則重新寫出到文件中 , 否則數據丟棄 , 這樣就實現了數據刪除操作 ;
/** 刪除學生*/ int delete() {// 打開學生信息文件FILE *p = fopen("student.dat", "r");// 如果打開失敗, 退出if (p == NULL)return 0;// 獲取文件大小 , 將文件指針跳轉到文件結尾fseek(p, 0, SEEK_END);// 獲取文件指針位置 , 該位置就是文件大小int size = ftell(p);// 為學生類型結構體分配堆內存空間, 分配文件大小空間struct student *s = malloc(size);// 文件指針指向開始位置fseek(p, 0, SEEK_SET);// 將所有的文件數據讀取到堆內存中fread(s, 1, size, p);// 關閉文件fclose(p);// 提示要刪除的學生名字printf("input delete student's name: ");// 獲取要刪除的學生名字char name[30] = { 0 };// 從命令行接收學生名字scanf("%s", name);// 統計文件中記錄了多少個學生信息int n = size / sizeof(struct student);//得到了多少記錄數// 循環控制變量int i;// 以寫的方式打開文件 , 本次寫入文件是覆蓋寫出文件p = fopen("student.dat", "w");// 循環遍歷結構體數據for(i = 0; i < n; i++){// 學生數據不是要刪除的數據, 才能寫出到文件中if (strcmp(s[i].name, name) != 0)// 寫出一條學生數據結構體fwrite(&s[i], 1, sizeof(struct student), p);}// 關閉文件fclose(p);// 釋放內存中的文件數據內存free(s);return 0; }二、完整代碼
代碼示例 :
#include <stdio.h> #include <stdlib.h> #include <string.h>// 存儲學生姓名和年齡結構體 struct student {char name[30]; // 姓名int age; // 年齡 };/** 插入學生數據*/ int insert() {// 要寫入文件的結構體struct student s1 = {0};// 打開要寫入的文件FILE *p = fopen("student.dat", "w");// 打開失敗直接退出if(p == NULL)return 0;while (1){// 提示輸入學生名字printf("input student's name:\n");// 阻塞等待命令行中用戶輸入學生名字scanf("%s", s1.name);// 如果用戶輸入 quit , 則退出循環 , 保存文件if(strcmp(s1.name, "quit")==0)break;// 提示輸入某個學生的年齡printf("input %s's age:\n", s1.name);// 命令行阻塞等待用戶輸入學生年齡scanf("%d", &s1.age);// 將結構體寫出到文件中fwrite(&s1, 1, sizeof (struct student), p);}// 關閉文件fclose(p);return 0; }/** 查詢學生數據*/ int query() {// 緩存信息用的結構體struct student s = { 0 };// 要查詢的數組char name[30] = { 0 };// 提示輸入要查詢的學生名字printf("input student's name:");// name 數組接收控制臺輸入的字符串scanf("%s", name);// 打開文件FILE *p = fopen("student.dat", "r");// 文件打開失敗退出if (p == NULL)return 0;// 使用該變量記錄是否查詢到學生信息int status = 0;// 循環讀取 student 結構體數據// 每次都可以讀取到一個學生數據// 判斷該數據是否是要查詢的學生數據while(1){// 從文件中讀取一個結構體大小的數據fread(&s, 1, sizeof(struct student), p);// 判斷是否讀取到文件末尾, 注意 feof 必須在文件操作之后才能調用if (feof(p))break;// 如果學生名字是 all , 則打印所有學生信息if (strcmp(name, "all") == 0){// 打印學生信息printf("name=%s, age=%d\n", s.name, s.age);// 標記信息找到status = 1;}else{// 對比本次讀取的學生信息是否是要查詢的信息if (strcmp(name, s.name) == 0){// 打印要查詢的學生信息printf("name=%s, age=%d\n", s.name, s.age);// 標記信息找到status = 1;}}}// 關閉文件fclose(p);// 如果學生信息沒有找到, 打印提示信息if (status == 0)printf("student %s not found\n", name);return 0; }/** 刪除學生*/ int delete() {// 打開學生信息文件FILE *p = fopen("student.dat", "r");// 如果打開失敗, 退出if (p == NULL)return 0;// 獲取文件大小 , 將文件指針跳轉到文件結尾fseek(p, 0, SEEK_END);// 獲取文件指針位置 , 該位置就是文件大小int size = ftell(p);// 為學生類型結構體分配堆內存空間, 分配文件大小空間struct student *s = malloc(size);// 文件指針指向開始位置fseek(p, 0, SEEK_SET);// 將所有的文件數據讀取到堆內存中fread(s, 1, size, p);// 關閉文件fclose(p);// 提示要刪除的學生名字printf("input delete student's name: ");// 獲取要刪除的學生名字char name[30] = { 0 };// 從命令行接收學生名字scanf("%s", name);// 統計文件中記錄了多少個學生信息int n = size / sizeof(struct student);//得到了多少記錄數// 循環控制變量int i;// 以寫的方式打開文件 , 本次寫入文件是覆蓋寫出文件p = fopen("student.dat", "w");// 循環遍歷結構體數據for(i = 0; i < n; i++){// 學生數據不是要刪除的數據, 才能寫出到文件中if (strcmp(s[i].name, name) != 0)// 寫出一條學生數據結構體fwrite(&s[i], 1, sizeof(struct student), p);}// 關閉文件fclose(p);// 釋放內存中的文件數據內存free(s);return 0; }/** 打印學生管理系統幫助信息*/ void printf_help() {printf("help info :\n");printf("i : insert student data\n");printf("q : query student data\n");printf("d : delete student data\n"); }/** 函數入口* 參數 i 表示插入數據* 參數 q 表示查詢數據* 參數 d 表示刪除數據*/ int main(int argc, char **args) {// 判斷參數個數是否合法if (argc < 2){// 提示正確的參數信息printf_help();return 0;}// 插入數據if (strcmp(args[1], "i") == 0)insert();// 查詢數據if (strcmp(args[1], "q") == 0)query();// 刪除數據if (strcmp(args[1], "d") == 0)delete();return 0; }編譯程序 : 生成 student.exe 可執行文件 ;
gcc main.c -o student
輸入錯誤參數 : 如果輸入參數小于 2 個 , 則提示參數信息 ;
插入數據 :
查詢數據 :
刪除數據 :
總結
以上是生活随笔為你收集整理的【C 语言】文件操作 ( 学生管理系统 | 插入数据 | 查询数据 | 删除数据 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【C 语言】文件操作 ( 学生管理系统
- 下一篇: 【Android 应用开发】Canvas