版权声明:本文为博主原创文章,如有需要,请注明转载地址:http://blog.csdn.net/morixinguan。若是侵权用于商业用途,请联系博主,否则将追究责任 https://blog.csdn.net/morixinguan/article/details/84783834
前面学习过如何操作CSV文件也写了相应的博客:
https://blog.csdn.net/morixinguan/article/details/83344951
并且也了解到如何拆分字符串:
https://blog.csdn.net/morixinguan/article/details/82967304
本节我们需要实现一个这样的函数,原型如下:
void Display_Record_Data(int line)
当line等于0时,表示读取CSV文件的第0行数据,等于100时,表示读取CSV文件的第100行数据,依次类推。
以下是我们要获取的数据,数据格式为:序号,时间,阈值,气雾,灵敏度
我们要做的事情就是,当传入为1时,则获取为当前CSV文件的第一行数据,并拆分出来。
源码实现:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#define SERIAL_NUMBER 0
#define DATE_TIME 1
#define DETECT_VALUE 2
#define SENSOR_STATU 3
#define SENSIVITY_STATU 4
struct Record_Page_Data
{
int serial_number ;
char date_time[20] ;
int detect_result ;
int sensor_status ;
int sensivity_status ;
int year ;
int month ;
int day ;
int hour ;
int minute ;
char _year[10] ;
char _month[10] ;
char _day[10] ;
char _hour[10] ;
char _minute[10] ;
};
struct Record_Page_Data csv_file_record ;
//根据逗号拆分字符串
static int splitStr(char *str,char separator, char strs[][40])
{
int i = 0,j = 0,n = 0;
for(i = 0; str[i]; ++i) {
if(str[i] == separator) {
strs[n++][j] = 0;
j = 0;
}
else strs[n][j++] = str[i];
}
strs[n++][j] = 0;
return n;
}
//显示记录数据
void Display_Record_Data(int line)
{
FILE *fp;
int para = 0 ;
int item = 0 ;
int which_line = line; //指定要读取哪一行
if(which_line == 0 || which_line < 0)
return ;
if(which_line > 0)
which_line-= 1 ;
int current_index=0; //当前读取的行
char strs[5][40] = {0};
char strLine[50]; //每行最大读取的字符数,可根据实际情况扩大
if((fp = fopen("file.csv","r")) == NULL) //判断文件是否存在及可读
{
printf("error!");
return ;
}
while (!feof(fp))
{
if(current_index == which_line)
{
fgets(strLine,50,fp); //读取一行
printf("CSV文件原始数据:%s", strLine); //输出
item = splitStr(strLine,',',strs);
for(para = 0 ; para < item ; para++)
{
switch(para)
{
case SERIAL_NUMBER:
csv_file_record.serial_number = atoi(strs[para]);
break ;
case DATE_TIME :
memcpy(csv_file_record.date_time,strs[para],strlen(strs[para]));
memcpy(csv_file_record._year,csv_file_record.date_time,4);
memcpy(csv_file_record._month,csv_file_record.date_time+5,2);
memcpy(csv_file_record._day,csv_file_record.date_time+8,2);
memcpy(csv_file_record._hour,csv_file_record.date_time+11,2);
memcpy(csv_file_record._minute,csv_file_record.date_time+14,2);
csv_file_record.year = atoi(csv_file_record._year);
csv_file_record.month = atoi(csv_file_record._month);
csv_file_record.day = atoi(csv_file_record._day);
csv_file_record.hour = atoi(csv_file_record._hour);
csv_file_record.minute = atoi(csv_file_record._minute);
break ;
case DETECT_VALUE :
csv_file_record.detect_result = atoi(strs[para]);
break ;
case SENSOR_STATU :
csv_file_record.sensor_status = atoi(strs[para]);
break ;
case SENSIVITY_STATU:
csv_file_record.sensivity_status = atoi(strs[para]);
break ;
}
}
}
fgets(strLine,50,fp); //读取一行,并定位到下一行
current_index++;
}
printf("序号:%d 时间:%d年%d月%d日 %d时%d分 阈值显示:%d 气雾状态:%d%% 灵敏度状态:%d\n",csv_file_record.serial_number,csv_file_record.year,csv_file_record.month, \
csv_file_record.day,csv_file_record.hour,csv_file_record.minute,csv_file_record.detect_result,csv_file_record.sensor_status,csv_file_record.sensivity_status);
fclose(fp); //关闭文件
return ;
}
int main(void)
{
int i ;
for(i = 1 ; i < 8 ; i++)
Display_Record_Data(i);
return 0 ;
}
运行结果:
在单片机fatfs上,我们一样也可以实现这样的功能,根据不同的实现可以组合出多种多样的应用。
参考资料: