c 数据存储读取
- 行业动态
- 2025-02-19
- 4
fopen
、
fwrite
、
fread
和
fclose
等。
C语言中的数据存储与读取
在C语言编程中,数据存储和读取是基础且核心的操作,它们涉及将数据保存到文件、数据库或其他持久化存储介质中,并在需要时将其读取回来,以下是对C语言中数据存储与读取的详细解析:
文件I/O操作
C语言通过标准I/O库(stdio.h)提供了一系列函数来处理文件输入输出操作,这些函数包括fopen()、fclose()、fread()、fwrite()、fscanf()、fprintf()等。
函数名 | 功能 | 示例代码 |
fopen | 打开文件 | FILE *fp = fopen("example.txt", "r"); |
fclose | 关闭文件 | fclose(fp); |
fread | 从文件中读取数据 | fread(buffer, sizeof(char), 100, fp); |
fwrite | 向文件写入数据 | fwrite(data, sizeof(char), strlen(data), fp); |
fscanf | 从文件中格式化读取数据 | fscanf(fp, "%d %s", &num, str); |
fprintf | 格式化写入数据到文件 | `fprintf(fp, “%d %s |
", num, str);` |
示例:
#include <stdio.h> #include <stdlib.h> int main() { FILE *fp; char data[100]; // 写入文件 fp = fopen("example.txt", "w"); if (fp == NULL) { perror("Unable to open file for writing"); exit(EXIT_FAILURE); } fprintf(fp, "Hello, World! "); fclose(fp); // 读取文件 fp = fopen("example.txt", "r"); if (fp == NULL) { perror("Unable to open file for reading"); exit(EXIT_FAILURE); } fgets(data, 100, fp); printf("File content: %s", data); fclose(fp); return 0; }
二进制文件操作
除了文本文件,C语言还支持二进制文件的读写,这通常用于非文本数据的存储,如图像、音频或自定义结构体。
函数名 | 功能 | 示例代码 |
fread | 从二进制文件中读取数据 | fread(&structData, sizeof(structData), 1, fp); |
fwrite | 向二进制文件写入数据 | fwrite(&structData, sizeof(structData), 1, fp); |
示例:
#include <stdio.h> #include <stdlib.h> typedef struct { int id; char name[50]; } Record; int main() { FILE *fp; Record r = {1, "John Doe"}; // 写入二进制文件 fp = fopen("record.dat", "wb"); if (fp == NULL) { perror("Unable to open file for writing"); exit(EXIT_FAILURE); } fwrite(&r, sizeof(Record), 1, fp); fclose(fp); // 读取二进制文件 Record r2; fp = fopen("record.dat", "rb"); if (fp == NULL) { perror("Unable to open file for reading"); exit(EXIT_FAILURE); } fread(&r2, sizeof(Record), 1, fp); printf("ID: %d, Name: %s ", r2.id, r2.name); fclose(fp); return 0; }
数据库交互(以SQLite为例)
虽然C语言本身不直接支持高级数据库操作,但可以通过集成第三方库如SQLite来实现,SQLite是一个轻量级的嵌入式数据库,非常适合嵌入式系统和小型应用。
步骤:
1、包含SQLite头文件并链接库。
2、打开数据库连接。
3、执行SQL语句(如CREATE TABLE、INSERT、SELECT)。
4、处理查询结果。
5、关闭数据库连接。
示例:
#include <sqlite3.h> #include <stdio.h> int main() { sqlite3 *db; char *errMsg = 0; int rc; rc = sqlite3_open("test.db", &db); if (rc) { fprintf(stderr, "Can't open database: %s ", sqlite3_errmsg(db)); return(0); } else { fprintf(stderr, "Opened database successfully "); } // 创建表 char *sql = "CREATE TABLE Students(Id INT, Name TEXT);"; rc = sqlite3_exec(db, sql, 0, 0, &errMsg); if (rc != SQLITE_OK ) { fprintf(stderr, "SQL error: %s ", errMsg); sqlite3_free(errMsg); } else { fprintf(stdout, "Table created successfully "); } // 插入数据 sql = "INSERT INTO Students (Id, Name) VALUES (1, 'Alice');"; rc = sqlite3_exec(db, sql, 0, 0, &errMsg); if (rc != SQLITE_OK ) { fprintf(stderr, "SQL error: %s ", errMsg); sqlite3_free(errMsg); } else { fprintf(stdout, "Records created successfully "); } // 查询数据 sql = "SELECT * FROM Students;"; rc = sqlite3_exec(db, sql, callback, 0, &errMsg); if (rc != SQLITE_OK ) { fprintf(stderr, "Failed to select data "); fprintf(stderr, "SQL error: %s ", errMsg); sqlite3_free(errMsg); } else { fprintf(stdout, "Operation done successfully "); } sqlite3_close(db); return 0; }
FAQs
Q1: 如何在C语言中实现文件的追加写入而不是覆盖写入?
A1: 在调用fopen()
函数时,使用模式字符串"a"
(表示追加模式)代替"w"
(表示写入模式)。fp = fopen("example.txt", "a");
,这样,每次写入的数据将被添加到文件末尾,而不是覆盖原有内容。
Q2: 如何确保在C语言中安全地读取未知大小的文件?
A2: 可以使用循环结合fgets()
或fread()
函数逐块读取文件,直到到达文件末尾,对于fgets()
,可以指定一个足够大的缓冲区,并在每次读取后检查是否到达了文件末尾(即返回值是否为NULL),对于fread()
,可以在读取前使用fseek()
和ftell()
确定文件大小,然后分多次读取整个文件内容,应始终检查每个I/O操作的返回值以确保没有错误发生。
小编有话说
C语言提供了丰富的接口和工具来进行数据存储与读取操作,无论是简单的文本文件还是复杂的二进制文件和数据库交互,掌握这些技能对于开发高效、可靠的应用程序至关重要,希望本文能帮助您更好地理解和应用C语言中的数据存储与读取技术。