关于C语言读CSV文件的问题
结构体data中的成员nam定义成了字符,而应该是字符串类型,改为:
char nam[100];
这样才能保存字符串,注意100的空间根据字符串实际大小情况调整,合适的数值。
另外,结构体数组的下标最好从0开始,要不浪费一块内存,比如:
for(i=0;i<r_n;i++)
DEBUG的时候可以发现,第一次循环时,执行到yy+=atof(stt[7]); 时,stt[7]的值突然被改变了,第二次循环时,甚至只执行到hx+=atof(stt[6]); stt[6]也被改变了.
我认为问题是由于strtok是不安全所导致的,它生成的字符串数组可能被其他线程修改.
我建议你用sscanf来读取字符串中的数字,比如:
#include "string.h"
#include "math.h"
void main()
{
FILE *fp; /*定义一个文件指针*/
double sx,yw,wl,hx,yy;
int i;
char str[81];
double score[5];
sx=yw=wl=hx=yy=0;
fp=fopen("分数表.csv", "rb"); /*打开文件只读*/
for(i=0;!feof(fp);i++)
{
fscanf(fp,"%s
",str);
sscanf(str+17,"%lf,%lf,%lf,%lf,%lf",score,score+1,score+2,score+3,score+4);
sx+=score[0];
yw+=score[1];
wl+=score[2];
hx+=score[3];
yy+=score[4];
}
printf("%f,%f,%f,%f,%f
",sx,yw,wl,hx,yy);
fclose(fp);
}
csv文件即逗号分隔值文件。
逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。
纯文本意味着该文件是一个字符序列,不含必须像二进制数字那样被解读的数据。
CSV文件由任意数目的记录组成,记录间以某种换行符分隔;每条记录由字段组成,字段间的分隔符是其它字符或字符串,最常见的是逗号或制表符。通常,所有记录都有完全相同的字段序列。
要用C语言读取CSV,首先需要确定文件中定义的字符分隔值,以及每一行各个列的元素格式。
如果所有的元素格式相同,那么可以每行一个一维数组,所有行组成一个二维数组,逐个元素进行读取。
如果元素格式不同,可以按照元素类型,构建一个结构体,每行读到一个结构体变量中,所有行组成一个结构体数组。
下面根据两种情况,按照分隔符为逗号(,),分别举一个例子:
文件名设定为in.csv,每行10个元素。
一、所有元素均相同类型,比如int型。
#include <stdio.h>
int main()
{
FILE*fp;
int a[100][10];//定义一个足够大的数组来存储。
int line = 0;
int c, i;
fp = fopen("in.csv", "r"); // 以文本方式打开。
if(fp == NULL) return -1; // 打开文件失败。
while(1)
{
i=0;//列标记清零。
while(1)
{
fscanf(fp, "%d", &a[line][i]);//从文件中读取一个元素。
c = getchar();//读取下一个字符,可能是分隔符,换行符或文件结尾。
if(c == '
'||c == EOF)break;//读完一行,或者到文件结尾,退出读取。
i++;
}
line ++;
if(c == EOF) break;
}
fclose(fp); //关闭文件。
//以下循环用来打印所有读到的值。
for(i = 0; i < line; i ++)
{
for(c = 0; c < 10; c ++)
printf("%d ", a[i][c]);
printf("
");
}
}
二、每行元素不同。
比如共三列,第一列是int型,第二列是字符串,第三列是float型。
如果分隔符不是空白字符,或者字符串元素中可能存在除分隔符外的其它空白字符,在读取字符串的时候是不能用fscanf函数的。
定义结构体如下
strcut data
{
int a;
char s[100]; //根据实际要求,定义足够大的字符数组。
float f;
};
读取代码如下:
#include <stdio.h>
int main()
{
FILE*fp;
strcut data a[100];//定义一个足够大的结构体一维数组来存储。
int line = 0;
int c,i;
fp = fopen("in.csv", "r"); // 以文本方式打开。
if(fp == NULL) return -1; // 打开文件失败。
while(1)
{
fscanf(fp, "%d", &a[line].a);//从文件中读取第一个元素。
c = getchar();//读取分隔符。
//接下来要读取字符串,需要逐个字符读入,直到出现分隔符为止。
i = 0;
while(1)
{
a[line].s[i] = getchar();//读入一个字符。
if(a[line].s[i] == ',')//发现分隔符
{
a[line].s[i]='\0'; //赋值字符串结束符。
break;//退出读取字符串。
}
i++;
}
//由于在读字符串的时候分隔符已经被读取,这里不需要读分隔符,而是直接读下一个元素。
fscanf(fp, "%f", &a[line].f);//从文件中读取最后一个元素。
c = getchar();//读取下一个字符,可能是换行符或文件结尾。
line ++;
if(c == EOF) break;//到文件结尾,退出读取。
}
fclose(fp); //关闭文件。
//以下循环用来打印所有读到的值。
for(i = 0; i < line; i ++)
{
printf("%d %s %f
", a[i].a, a[i].s, a[i].f);
}
}
逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。纯文本意味着该文件是一个字符序列,不含必须像二进制数字那样被解读的数据。CSV文件由任意数目的记录组成,记录间以某种换行符分隔;每条记录由字段组成,字段间的分隔符是其它字符或字符串,最常见的是逗号或制表符。通常,所有记录都有完全相同的字段序列。
CSV文件文件是普通文本文件,直接使用文本文件控制参数“r”通过fopen函数即可打开。例如:
int a,b;
char s[100];
FILE *fp; /*定义一个文件指针*/
fp=fopen("分数表.csv", "r"); /*打开文件csv文件*/
while(fscanf(fp,"%d,%d,%s",&a,&b,s)!=EOF){ /*利用逗号间隔,读取文本数据*/
/*处理读取的文本信息*/
}
fclose(fp); /*关闭打开的文件*/
CSV 文件改用 空白或tab做分隔符,不要用逗号做分隔符。
用逗号做分隔符,控制不了字符串的阅读。
20080101 改用 字符串 存放较好。整数可能会超界。
CSV 文件的读入最好一次对入一行
while ( ( fgets( str, 100, fp )) != NULL ) {
然后每一行里在用,号去区分
stri = strtok( NULL, "," );
20080104这么大一个数你能用int id; 表示?
name 读取的是字符,而,也是肯定会当作字符处理了,而不是分界点.
关于C语言读CSV文件的问题
int line = 0; int c,i; fp = fopen("in.csv", "r"); \/\/ 以文本方式打开。 if(fp == NULL) return -1; \/\/ 打开文件失败。 while(1) { fscanf(fp, "%d", &a[line].a);\/\/从文件中读取第一个元素。 c = getchar();\/\/读取分隔符。 \/\/接下来要...
C语言读取+csv文件时,文件是空的为什么还能读取到随机赋值的内容?
因为在打开CSV文件时使用了写入模式,而非读取模式,这会覆盖文件中原有的内容,导致文件为空。在接下来读取CSV文件时,可能使用了之前给变量赋过值的代码,所以读入的数据是之前这些变量赋过的随机值,而不是CSV文件中实际的数据
C语言读取写入CSV文件 [二]进阶篇——写入CSV文件
处理包含特殊符号的字段时,必须使用双引号包裹。如逗号、换行符、双引号等。但请注意,C语言中的双引号在字符串中需通过反斜杠表示。接着探讨CSV文件中开头和结尾的空格与制表符的处理。根据RFC 4180标准,空格被视为字段的一部分,不应忽略。然而,标准不强制,某些实现会截断空格与制表符。例如,`fpr...
C语言读取写入CSV文件 [一]基础篇
什么是CSV?CSV,即逗号分隔值,是一种纯文本格式的表格数据,记录由字段组成,以逗号或其他字符分隔,每行记录后以换行符分隔。它是一种通用的数据交换格式,常用于不同程序间的数据传输。虽然没有明确的统一格式,但最常见的是逗号分隔字段,换行符分隔记录。C语言操作CSV文件写入CSV文件在C语言中,用f...
C语言读取写入CSV文件 [三] 进阶篇——读取CSV文件
本文深入探讨C语言读取CSV文件的进阶方法,涵盖数据处理、结构体应用、识别包裹字段、空格与制表符处理、适应其他分隔符以及引入现有库支持等。在基础篇中,仅实现了数据的简单读取与输出,未涉及数据类型转换。对于整数,可以使用atoi()、atol()、atoll()转换为整数类型;浮点数则利用atof()转换为双精度...
C语言如何按列读取csv中的两列不知道个数的数据,并能对两个同一行的数 ...
我用C语言来读取csv文件中的多行多列数据,用的是fgets和sscanf函数,想一次读取一行数据(包含多列),但是怎么也读不 出来。希望能给出解决方法。谢谢了。我是这样用的 FILE* file;const char *filename;int file_ended = 0;filename="tong.csv";file=fopen(filename,"r");if (file==NULL)...
c语言,关于读取csv文件的数据,(一行有四列)显示在屏幕。下面的代码...
printf ("%s\\n", check);修改其中的%s呀,比如:你想固定10个宽度,即:%10s.
C语言 fgets函数读取CSV文件如何从第二行开始,第一行是表头。
参数:buf: 字符型指针,指向用来存储所得数据的地址。bufsize: 整型数据,指明存储数据的大小。stream: 文件结构体指针,将要读取的文件流。返回值:成功,则返回第一个参数buf;在读字符时遇到end-of-file,则eof指示器被设置,如果还没读入任何字符就遇到这种情况,则buf保持原来的内容,返回NULL;如...
用c语言读取csv文件中的一列数据并求这些数据的平均值
void main(){ int i,n=0;float x[1000],val;FILE *fp;if((fp=fopen("test.csv","rt"))==NULL){ printf("cannot open file\\n");return;} while (1){ if(fscanf(fp,"%f,", &val) == EOF) break;x[n]=val;n++;} fclose(fp);val=0;for(i=0;i<n;i++)val+=x[i];...
c语言读csv
define MAXCHAR 100 int main(){ FILE *pb;int i,num = 0,j = 0;char pchar[MAXCHAR];char **ppstr;char *pstr,*ppchar;memset(pchar, 0, 100);pb = fopen("D:\\\\pb.csv","r");if (pb == NULL){ printf("error!");return;} ppstr = (char **)malloc(5*sizeof...