㈠ 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;
}