当前位置:首页 > 行业动态 > 正文

c 数据存储读取

C语言中,数据存储读取通常涉及使用文件I/O函数,如 fopenfwritefreadfclose等。

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);

示例:

c 数据存储读取  第1张

#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语言中的数据存储与读取技术。

0