C语言问题3

您所在的位置:网站首页 c语言读取文件数据并赋值 C语言问题3

C语言问题3

2023-12-27 19:50| 来源: 网络整理| 查看: 265

1、问题描述

现有一个CSV文件,里边的数据需要进行自动化处理,如何利用C语言读取CSV文件内的数据。

2、解决方案

CSV文件中数据类型有多种,一般来说,每一列的数据类型相同,可以用结构体来将一行的数据存储。中间涉及到读取CSV数据,数据提取存放入结构体变量等关键步骤。

3、程序示例 /**************************************************************************/ //程序名:1Read_example.c //程序作用:可以完整读取CSV的整个文件,并将这些数据放入结构体dataArr[]中 //程序使用:运行后,输入同目录下的文件名,可将csv中的数据读取到结构体 //作者:罗特布克;创建时间:2023.10.20 //备注: /**************************************************************************/ /*包含的头文件*/ #include #include #include #include   //使用abs(对整数取绝对值)、fabs(对浮点型或小数取绝对值) #include //布尔型数据需要 /*对数据量的宏定义*/ #define MAX_LINE_LENGTH 100   //设定每行最大的字符数,后边出现的MAX_LINE_LENGTH就使用1000来代替 #define MAX_LINE_NUMBER 40   //设定最大的行数,可按照实际的需求更改。 typedef struct csvdata1  //定义一个结构体来存放CSV的数据,定义表格中的数据可以用结构体来构造。这里也可以把结构体名data1省略(匿名结构体)。 {                     //匿名结构体: 这种定义方式只能定义一次,不能重新再去定义别的变量.     int num;           //编号     char name[50];    // 姓名     float grade1;     // 科目1成绩     float grade2;      // 科目3成绩     float grade3;     // 科目3成绩     float aver;      // 科目平均成绩 } Data;  //定义一个结构体变量Data Data dataArr[MAX_LINE_NUMBER]; // 定义结构体数组dataArr[],这里省略了struct。 char line[MAX_LINE_LENGTH];    //定义字符串line,每行最大MAX_LINE_LENGTH个字符长度,字符串line中就包含一行的所有信息。 int dataIndex = 0;             //行数记录 /*主函数读取CSV数据*/ void main() {     FILE *fp;     char filename[40];           //文件名字(字符串)长度,一个字母占1个长度,最后加“\0”一个长度。     SetConsoleOutputCP(65001);   //调用该API函数,设置控制台程序输出的代码页编码为utf-8格式。没有这个中文会成乱码。     printf(" 输入文件名(需要带后缀.csv): ");         gets(filename);     fp=fopen(filename,"r");           if (fp == NULL)             //如果打开文件错误     {         printf("文件打开失败,请确认:\n 1、文件名是否输入正确\n 2、文件是否在本程序文件夹下 \n");         system("pause");   //暂停显示     }     /*csv数据读取部分*/     while (fgets(line, sizeof(line), fp))            //fgets函数的用法?     {         char *token = strtok(line, ",") ;         dataArr[dataIndex].num = atoi(token);           //获取逗号之前的数据         token = strtok(NULL, ",");                  //接着调用strtok(NULL, ",")以获取下一个逗号之后的部分         strcpy(dataArr[dataIndex].name, token);         token = strtok(NULL, ",");           dataArr[dataIndex].grade1 = atof(token);     //atof函数将其转换为浮点数后赋值给dataArr[dataIndex].score         token = strtok(NULL, ",");           dataArr[dataIndex].grade2 = atof(token);         token = strtok(NULL, ",");           dataArr[dataIndex].grade3 = atof(token);         dataIndex++;                            //记录数据量     }     fclose(fp);   /*计算输出结果*/     for (int i = 0; i < dataIndex; i++)     {         dataArr[i].aver=(dataArr[i].grade1+dataArr[i].grade2+dataArr[i].grade3)/3; //计算平均值         printf("number: %d, name: %s, grade1: %f, grade2: %f, grade3: %f, average: %f \n",                dataArr[i].num, dataArr[i].name, dataArr[i].grade1, dataArr[i].grade2, dataArr[i].grade3, dataArr[i].aver);      }     system("pause"); //暂停显示输出结果 }

4、结果展示

读取的文件需要放在应用程序相同的文件夹下,命名如test.csv。WPS打开如下:

读取后显示:



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3