📜  C |文件处理|问题3(1)

📅  最后修改于: 2023-12-03 14:39:40.781000             🧑  作者: Mango

C文件处理问题3

在C语言中,我们可以使用文件操作来处理文件,包括读取、写入、打开、关闭等操作。在这里,我们将介绍一个C文件处理的问题,即如何读取CSV文件并将其保存到结构体数组中。

需求

我们假设有一个名为data.csv的CSV文件,其中存储了若干个学生的成绩信息,包括学生姓名、语文、数学、英语三科成绩。现在我们需要读取这个CSV文件,并将每个学生的信息保存到一个结构体中,最后将所有学生的结构体保存到一个结构体数组中,以便于后续处理。

实现

我们可以通过以下步骤来实现读取CSV文件并保存到结构体数组中的功能。

步骤1:定义结构体

我们先定义一个结构体来保存每个学生的信息。

typedef struct {
    char name[20];
    int scoreChinese;
    int scoreMath;
    int scoreEnglish;
} Student;

每个学生的信息包括姓名和三科成绩。

步骤2:打开文件并读取

我们可以使用fopen函数打开文件,并使用fgets函数逐行读取文件中的数据。由于每个学生的信息是一行数据,因此我们可以使用逗号作为分隔符,将每行数据拆分成多个字段,并依次将这些字段保存到结构体中。

// 打开文件
FILE* fp = fopen("data.csv", "r");
if (fp == NULL) {
    printf("Failed to open file\n");
    return;
}

// 初始化结构体数组
Student studentArray[100] = {0};
int numStudent = 0;

// 逐行读取数据
char line[1024];
while (fgets(line, sizeof(line), fp)) {
    // 拆分数据
    char* pch = strtok(line, ",");
    strcpy(studentArray[numStudent].name, pch);
    pch = strtok(NULL, ",");
    studentArray[numStudent].scoreChinese = atoi(pch);
    pch = strtok(NULL, ",");
    studentArray[numStudent].scoreMath = atoi(pch);
    pch = strtok(NULL, ",");
    studentArray[numStudent].scoreEnglish = atoi(pch);

    numStudent++;
}

// 关闭文件
fclose(fp);

在上面的代码中,我们使用了strtok函数将一行数据拆分成多个字段,并使用strcpy和atoi函数将这些字段保存到结构体中。注意在使用strtok函数时需要将上一次的地址传入,以便从上一次的位置开始继续拆分。另外,由于CSV文件中的数据都是字符串类型,因此我们需要使用atoi函数将数字字符串转换成整数。

步骤3:处理数据

现在我们已经将所有学生的信息存储在结构体数组中了,我们可以使用这些数据进行后续处理。例如,我们可以按照成绩排序,计算平均分等等。

结论

在这篇文章中,我们介绍了如何读取CSV文件并将其保存到结构体数组中。通过将最初的文本数据转换成结构化的数据,我们可以更方便地对数据进行后续处理,从而达到更高的效率。