C语言问题3 |
您所在的位置:网站首页 › c语言读取文件数据并赋值 › C语言问题3 |
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 |