头文件
/*
* Author : LHS
*
* Version: 1.00
*
* Date : 2022-03-18
*
* Bref : Read CSV files based on C language.
*
*/
#ifndef __READ_CSV_FILE_H_
#define __READ_CSV_FILE_H_
#include <stdio.h>
#include <string.h>
#define MAX_LINE_SIZE 256 //fgets函数读取的最大字节数
#define CSV_SUCCESS (0)
#define CSV_FAILED (-1)
int openCsv(char* csvFilePath); //打开csv文件
void closeCsv(void); //关闭csv文件
int getTotalLineCount(void); //计算csv文件中的总行数
int getTotalColCount(void); //计算csv文件中的总列数(第一行为准)
int setRow(int row); //设置光标指向第row行
char* getRow(int row); //获取第row行的数据,并将指针指向下一行
char* getCurRow(void); //获取当前行数据,并将指针指向下一行
#endif /* __READ_CSV_FILE_H_ */
源文件
/*
* Author : LHS
*
* Version: 1.00
*
* Date : 2022-03-18
*
* Bref : Read CSV files based on C language.
*
*/
#include "readCSVFile.h"
static FILE* fp=NULL;
static char s_stringBuf[MAX_LINE_SIZE];
static int s_total_row=0; //总行数,打开csv文件时更新
static int s_total_col=0; //总列数,打开csv文件时更新
//返回csv文件中的总行数
int getTotalRowCount(void)
{
return s_total_row;
}
//返回csv文件中的总列数(以第一行的列数为基准)
int getTotalColCount(void)
{
return s_total_col;
}
int openCsv(char* csvFilePath)
{
char *ptr;
//关闭上一个文件
if(fp == NULL){
closeCsv();
fp = NULL;
}
//只读方式打开
if( fopen_s( &fp, csvFilePath, "r" ) != 0 )
{
return CSV_FAILED;
}
s_total_row=0;
s_total_col=0;
//获取列,分隔符为","
fseek(fp,0,SEEK_SET);
if (fgets(s_stringBuf, MAX_LINE_SIZE, fp))
{
ptr=strtok(s_stringBuf,",");
while(ptr!=NULL) {
ptr = strtok(NULL,",");
s_total_col++;
}
}
//获取总行数,以换行符结束
fseek(fp,0,SEEK_SET);
while (fgets(s_stringBuf, MAX_LINE_SIZE, fp)){
s_total_row++;
}
memset(s_stringBuf,0,sizeof(s_stringBuf));
fseek(fp,0,SEEK_SET);
return CSV_SUCCESS;
}
void closeCsv(void)
{
if(fp != NULL){
fclose(fp);
}
}
//设置当前行文件指针
int setRow(int row)
{
if(fp == NULL) return CSV_FAILED;
char strLine[MAX_LINE_SIZE];
fseek(fp,0,SEEK_SET);
while(row--){
if(fgets(strLine,MAX_LINE_SIZE,fp) == NULL) return CSV_FAILED;
}
return CSV_SUCCESS;
}
//获取指定行数据
char* getRow(int row)
{
if(fp == NULL) return NULL;
if(setRow(row) == CSV_SUCCESS){
memset(s_stringBuf,0,sizeof(s_stringBuf));
if(fgets(s_stringBuf,MAX_LINE_SIZE,fp) == NULL) return NULL;
}
return s_stringBuf;
}
//获取当前行数据,文件指针增加到下一行
char* getCurRow(void)
{
if(fp == NULL) return NULL;
if(fgets(s_stringBuf,MAX_LINE_SIZE,fp) == NULL)return NULL;
return s_stringBuf;
}
colhdr.csv文件数据(可以自己随便写一个,逗号分隔)
Open,High,Low,Close,Volume,Adj Close
64.529999,64.800003,64.139999,64.620003,21705200,64.620003
64.419998,64.730003,64.190002,64.620003,20235200,64.620003
64.330002,64.389999,64.050003,64.360001,19259700,64.360001
64.610001,64.949997,64.449997,64.489998,19384900,64.489998
64.470001,64.690002,64.300003,64.620003,21234600,64.620003
例程
#include "ReadCsvFile.h"
int main(int argc, char const *argv[])
{
if(openCsv("colhdr.csv") == CSV_SUCCESS){
printf("open colhdr.csv successful!\n");
printf("row:%d\n",getTotalRowCount());
printf("col:%d\n",getTotalColCount());
printf("%s",getRow(0));
printf("%s",getRow(1));
printf("%s",getRow(2));
setRow(0);
for(int i=0;i<getTotalRowCount();i++){
printf("%s",getCurRow());
}
}
return 0;
}
输出信息