㈠ C语言读CSV文件问题
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\n",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\n",sx,yw,wl,hx,yy);
fclose(fp);
}
㈡ 用c语言来打开csv格式内容怎么做
csv是逗号分隔的, 其它的 都等同于纯文本
所以 简单的csv文件, 只需要按照文本方式打开
然后以逗号为分隔符 读取每个域的内容就可以了。
可以根据内容约定, 存储成数组或者结构体
㈢ C语言读取CSV文件到二维数组
这个程序的关键部分是读每一行中,
由逗号分隔的各个字段,也即token.
对每一行,把每个字段逐一取出,然后想用就用,不用丢弃.----这个思路,应该是既单纯,又比较优雅吧.
为此,为你单独写了这一思路的实现及相关测试,
代码如下:
---------------------------------------opstring.c
int get_next_token_CLangVersion
( const char* from , //0218,13
char* token, char token_seper )
{
static char* from_old = 0 ;
static int fromidx = 0;
char c ;
//init for new begin
if (from != from_old )
{ from_old = from ;
fromidx = 0 ;
}
//init for next new token
*token = 0 ;
//check --can be getting ?
if (fromidx == -1) return -1;
//get token
//get a char from "from", then get again
while ( (c=*(from+fromidx++))
!= 0 && c != token_seper )
*(token++) = c ;
//get done
if ( c== 0) fromidx = -1 ;
if ( c== token_seper)
{/*do nothing .
fromidx恰好已指向下一个token之起始位置*/
}
*token = 0; //token结束
return 0 ;
}
-------------------------------------------------test.c
#include <stdio.h>
#include "opstring.h"
void main ()
{
char token[100] ;
char s[1024] ;
int ret = 0;
scanf ( "%s", s) ;
*token = '#';
for ( ; ret != -1;)
{ printf ("token--%s--\n", token) ;
ret = get_next_token_CLangVersion (s, token, ',') ;
}
}
/*
23,,,3444444443lld,,4444444444444444,266,d,,fddd3-,
token--#--
token--23--
token----
token----
token--3444444443lld--
token----
token--4444444444444444--
token--266--
token--d--
token----
token--fddd3---
token----
*/
-------------------------------------------opstring.h
int get_next_token_CLangVersion ( const char* from ,char* token, char token_seper ) ;
该实现在Borland C++ 5.6.4 for Win32 环境下,测试通过.
该实现是可复用的哟.祝你好运.
关键部分解决了,其它部分对你而言,应该是小菜一碟吧呵,我想.^_^
㈣ C语言中怎么动态的连接CSV格式的文件,并进行数据处理 谁知道啊,高分求教
CSV文件可看作是用逗号抄分隔的文本文件袭(用记事本打开看就知道了)。
直接按照读取TXT文本文件的方式读取就可以了,每行的数据再用Split()函数按照逗号','分开就可以得到每列的数据,然后就可以进行数据处理了。
㈤ 用c语言读取csv文件中的一列数据并求这些数据的平均值
#include <stdio.h>
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];
if(n>0) val=val/n;
printf("%g\n",val);
}
㈥ vs2010 c程序读取csv文件
csv是按逗号分隔的
如果确定有且只有两列
那么循环用
fscanf(fp, "%f,%f", &a[i], &b[i]);
即可
其中fp为打开的文件指针 a b是你的目标数组
i为读入的下标
判断fscanf返回值 或者读后判断feof可以确定终止条件
㈦ C语言 fgets函数读取CSV文件如何从第二行开始,第一行是表头。
第一次获取的数据不要就可以了,何必这么麻烦。
函数原型:
char *fgets(char *buf, int bufsize, FILE *stream);
参数:
*buf:字符型指针,指向用来存储所得数据的地址。
bufsize:整型数据,指明存储数据的大小。
*stream:文件结构体指针,将要读取的文件流。
返回值:
成功,则返回第一个参数buf;
在读字符时遇到end-of-file,则eof指示器被设置,如果还没读入任何字符就遇到这种情况,则buf保持原来的内容,返回NULL;
如果发生读入错误,error指示器被设置,返回NULL,buf的值可能被改变。
例子:
#include<string.h>
#include<stdio.h>
intmain(void)
{
FILE*stream;
charstring[]="Thisisatest";
charmsg[20];
/*openafileforupdate*/
stream=fopen("DUMMY.FIL","w+");
/*writeastringintothefile*/
fwrite(string,strlen(string),1,stream);
/*seektothestartofthefile*/
fseek(stream,0,SEEK_SET);
/*readastringfromthefile*/
fgets(msg,strlen(string)+1,stream);
/*displaythestring*/
printf("%s",msg);
fclose(stream);
return0;
}