我需要从CSV文件中读取一些数据并创建数据结构,以便创建一个哈希表。我已经尝试了很多并且失去了很多时间但没有结果。请检查我的代码并帮我找出错误的位置......
这是文件数据,输出和代码。
(我在Deitel和Deitel的C编程语言的帮助下单独编写代码。)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
struct clientData
{
int acctNum;
char breaker[50];
char datetime[60];
double current;
};
int main()
{
FILE *cfPtr;
struct clientData client = {0,"","",0.0 };
if ( ( cfPtr = fopen("data1.csv","rb") ) == NULL)
{
printf("File could not be opened.\n");
}
else
{
printf("%-6s%-16s%-11s%10s\n","Acct","Last Name","First Name","Balance");
while ( !feof( cfPtr) )
{
fread( &client , sizeof ( struct clientData ), 1 , cfPtr );
if ( client.acctNum !=0 )
{
printf ("%-6d%-16s%-11s%10.2f\n",
client.acctNum,client.breaker,client.datetime,client.current );
}
}
fclose ( cfPtr );
}
return 0 ;
}
ACCT,断路器,S_TimeStamp,MeasurementValue 1,EthiotideAtalantiMVBreakerBB2Q2Current 1 /二万〇一百五十八分之一十二:30,37.6 2,EthiotideAtalantiMVBreakerBB2Q2Current 1 /二万零一百五十九分之十二:00,34.2 3,EthiotideAtalantiMVBreakerBB2Q2Current 1 /二万零一百五十九分之十二:30,37.2 4,EthiotideAtalantiMVBreakerBB2Q2Current 1 /二十零万一千五百十分之十二:00,40.6 5,EthiotideAtalantiMVBreakerBB2Q2Current 1 /二十零万一千五百十分之十二:30,41.8 6,Eth1iotideAtalantiMVBreakerBB2Q2Current 1 /二十零万一千五百十一分之十二:00,45.8
帐户姓氏名字余额 1952670561,断路器,S_TimeStamp,MeasurementValue 1,EthiotideAtalantiMVBreakerBB2Q2Current 1 /二万〇一百五十八分之一十二:30,37.6 2,EthiotideAtalantiMVBreak @ talantiMVBreakerBB2Q2Current 1 /二万零一百五十八分之十二:30,37.6 2,EthiotideAtalantiMVBreak @ 178724158464812467496986462827554460798109233540662154481413250685702096704425934569739618465990294960631478737616585889239313529311067888348744695823558167564353119398296863451093505908419875899425197001801728.00 11116509172Q2Current 1 /二万零一百五十九分之十二:00,34.2 3,EthiotideAtalantiMVBreakerBB2Q2Current 1 /二万零一百五十九分之十二:30,37.2 4,EthiotideAtalantiMVBreakerBB2Q2C @ VBreakerBB2Q2Current 1 /二万零一百五十九分之十二:30,37.2 4,EthiotideAtalantiMVBreakerBB2Q2C @ 5155825882657381.00 1701999221nt 1 /二十零万一千五百一十分之一十二:00,40.6 5,EthiotideAtalantiMVBreakerBB2Q2Current 1 /二十零万一千五百十分之十二:30,41.8 6,Eth1iotideAtalantiMVBreakerBB2Q2Curren @ rBB2Q2Current 1 /二十万一千五百一十分之十二:30,41.8 6,Eth1iotideAtalantiMVBreakerBB2Q2Curren @ 62020397019943253271215041932658580009235443368333447944639125867547040589859590642175830919754237423637956114804980964218473105282339526865630710982971497957257635386734871861549462238776468516448931338295812955819267325952.00201511分之79175179612:00,45.8 40.6 5,EthiotideAtalantiMVBreakerBB2Q2Current,1/12/201510:30,41.8 6,Eth1iotideAtalantiMVBreakerBB2Q2Curren @ rBB2Q2Current,1 / 12/201510:30,41.8 6,Eth1iotideAtalantiMVBreakerBB2Q2Curren @ 62020397019943253271215041932658580009235443368333447944639125867547040589859590642175830919754237423637956114804980964218473105282339526865630710982971497957257635386734871861549462238776468516448931338295812955819267325952.00
答案 0 :(得分:0)
#include <stdio.h>
struct clientData{
int acctNum;
char breaker[50];
char datetime[60];
double current;
};
int main(void){
FILE *cfPtr;
struct clientData client = {0,"","",0.0 };
if((cfPtr = fopen("data1.csv","r")) == NULL){
printf("File could not be opened.\n");
} else {
char line[96];
printf("%-6s%-40s%-20s%10s\n", "Acct", "Breaker", "TimeStamp", "MeasurementValue");
while(fgets(line, sizeof line, cfPtr)){
int state = sscanf(line, "%d,%49[^,],%59[^,],%lf", &client.acctNum, client.breaker, client.datetime, &client.current);
if(state == 4 ) {
printf("%-6d%-40s%-20s%10.2f\n",
client.acctNum, client.breaker, client.datetime, client.current);
}
}
fclose ( cfPtr );
}
return 0;
}