上一篇
小张是个刚学完C语言的编程新手,最近在开发一个学生成绩管理系统,他遇到了一个头疼的问题:每次运行程序都要重新输入数据,程序一关闭,所有数据就消失了。"要是能像那些高级语言一样有方便的数据库就好了",小张边叹气边想着,C语言本身虽然没有像MySQL那样的完整数据库系统,但它确实自带了一些简单实用的数据存储方案,完全能满足小型应用的需求。
C标准库提供的文件操作函数是最直接的数据存储方案,别看它简单,用好了能解决大部分数据存储需求。
#include <stdio.h> int main() { // 写入数据 FILE *file = fopen("data.txt", "w"); if (file != NULL) { fprintf(file, "学生姓名: 张三\n成绩: 90\n"); fclose(file); } // 读取数据 file = fopen("data.txt", "r"); if (file != NULL) { char buffer[100]; while (fgets(buffer, sizeof(buffer), file) != NULL) { printf("%s", buffer); } fclose(file); } return 0; }
优点:
缺点:
对于需要存储大量结构化数据的场景,二进制文件是更好的选择。
#include <stdio.h> typedef struct { char name[50]; int score; } Student; int main() { Student s = {"李四", 85}; // 写入二进制数据 FILE *file = fopen("students.dat", "wb"); if (file != NULL) { fwrite(&s, sizeof(Student), 1, file); fclose(file); } // 读取二进制数据 file = fopen("students.dat", "rb"); if (file != NULL) { Student readStudent; fread(&readStudent, sizeof(Student), 1, file); printf("姓名: %s\n成绩: %d\n", readStudent.name, readStudent.score); fclose(file); } return 0; }
优点:
缺点:
对于需要频繁访问的大型数据文件,内存映射技术能显著提高性能。
#include <stdio.h> #include <sys/mman.h> #include <fcntl.h> #include <unistd.h> int main() { const char *filename = "large_data.dat"; int fd = open(filename, O_RDWR | O_CREAT, 0666); // 设置文件大小 ftruncate(fd, 1024*1024); // 1MB // 内存映射 char *mapped = mmap(NULL, 1024*1024, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); // 使用映射内存 sprintf(mapped, "这是通过内存映射写入的数据"); // 解除映射 munmap(mapped, 1024*1024); close(fd); return 0; }
优点:
缺点:
结合上述技术,我们可以创建一个简单的键值存储系统:
#include <stdio.h> #include <string.h> #define MAX_ENTRIES 100 typedef struct { char key[50]; char value[100]; } DatabaseEntry; void saveDatabase(DatabaseEntry db[], int count, const char *filename) { FILE *file = fopen(filename, "wb"); if (file) { fwrite(&count, sizeof(int), 1, file); fwrite(db, sizeof(DatabaseEntry), count, file); fclose(file); } } int loadDatabase(DatabaseEntry db[], const char *filename) { FILE *file = fopen(filename, "rb"); if (file) { int count; fread(&count, sizeof(int), 1, file); fread(db, sizeof(DatabaseEntry), count, file); fclose(file); return count; } return 0; } int main() { DatabaseEntry db[MAX_ENTRIES]; int count = 0; // 添加一些数据 strcpy(db[count].key, "student1"); strcpy(db[count].value, "张三,90"); count++; strcpy(db[count].key, "student2"); strcpy(db[count].value, "李四,85"); count++; // 保存数据库 saveDatabase(db, count, "mydatabase.db"); // 清空内存中的数据 count = 0; // 重新加载数据库 count = loadDatabase(db, "mydatabase.db"); // 查询数据 for (int i = 0; i < count; i++) { printf("键: %s, 值: %s\n", db[i].key, db[i].value); } return 0; }
C语言自带的这些数据存储方案虽然简单,但足够强大,能够满足大多数小型应用的需求,对于像小张这样的初学者来说,掌握这些基础技术不仅能够解决眼前的问题,还能为将来学习更复杂的数据库系统打下坚实的基础,在编程中,有时候最简单的解决方案往往就是最好的解决方案。
本文由 谏水儿 于2025-08-01发表在【云服务器提供商】,文中图片由(谏水儿)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/505944.html
发表评论