解析csv文件,填充结构并写入二进制数据文件
我正在尝试读取csv文件并对其进行解析,然后填充一个结构,将其写入一个二进制.dat文件,此时我陷入了困境。我正在尝试创建10个.csv文件列表,以下是csv文件格式的示例: Shannon,Rylie,1001,5824.12,1500.00 这是我的代码:解析csv文件,填充结构并写入二进制数据文件,c,parsing,csv,struct,C,Parsing,Csv,Struct,我正在尝试读取csv文件并对其进行解析,然后填充一个结构,将其写入一个二进制.dat文件,此时我陷入了困境。我正在尝试创建10个.csv文件列表,以下是csv文件格式的示例: Shannon,Rylie,1001,5824.12,1500.00 这是我的代码: #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #define MAXBUFSIZE 511 #define LOOPNUMBER 30 #define BUFFER_S
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define MAXBUFSIZE 511
#define LOOPNUMBER 30
#define BUFFER_SIZE 1024
typedef struct{
int accountNumber;
char firstName[MAXBUFSIZE + 1];
char lastName[MAXBUFSIZE + 1];
double accountBalance;
double lastPaymentAmount;
} accounts;
int main(void){
int i;
char buf[1024];
const char* tok;
accounts myarray[10];
FILE *fpData;
accounts temp = { 0, "", "", 0.0, 0.0 };
if ((fpData = fopen("accounts.csv", "r")) == NULL) //Reading a file
{
printf("File could not be opened.\n");
}
while (fgets(buf, BUFFER_SIZE, fpData) != NULL)
{
/* Here we tokenize our string and scan for " \n" characters */
// for(tok = strtok(buf,"\n");tok;tok=strtok(NULL,"\n"))
// {
tok = strtok(buf, ",");
temp.accountNumber = atoi(tok);
printf(" %i ", temp.accountNumber);
tok = strtok(NULL, ",");
strncopy(temp.firstName, tok, MAXBUFSIZE);
temp.firstName[MAXBUFSIZE] = '\0';
tok = strtok(NULL, ",");
strncopy(temp.lastName, tok, MAXBUFSIZE);
temp.lastName[MAXBUFSIZE] = '\0';
tok = strtok(NULL, ",");
temp.accountBalance = atof(tok);
printf("temp.accountBalance = %.2f ", temp.accountBalance);
tok = strtok(NULL, ",");
temp.lastPaymentAmount = atof(tok);
printf("temp.lastPaymentAmount = %.2f ", temp.lastPaymentAmount);
tok = strtok(NULL, ",");
printf("\n");
memcpy(&myarray[LOOPNUMBER], &temp, sizeof(accounts));
}
if ((fpData = fopen("accounts.dat", "wb")) == NULL)
{
printf("File could not be opened.\n");
}
else
{
for (i = 0; i < 10; i++)
{
fwrite(myarray, sizeof(accounts), 10, fpData);
}
}
fclose(fpData);
}
\define\u CRT\u SECURE\u NO\u警告
#包括
#定义MAXBUFSIZE 511
#定义循环数30
#定义缓冲区大小1024
类型定义结构{
国际帐户号码;
char firstName[MAXBUFSIZE+1];
char lastName[MAXBUFSIZE+1];
双重账户余额;
双倍的最后付款金额;
}账目;
内部主(空){
int i;
char-buf[1024];
const char*tok;
账户myarray[10];
文件*fpData;
帐户温度={0,“,”,0.0,0.0};
if((fpData=fopen(“accounts.csv”,“r”))==NULL)//读取文件
{
printf(“无法打开文件。\n”);
}
while(fgets(buf,BUFFER_SIZE,fpData)!=NULL)
{
/*在这里,我们标记字符串并扫描“\n”字符*/
//对于(tok=strtok(buf,“\n”);tok;tok=strtok(NULL,“\n”))
// {
tok=strtok(buf,“,”);
温度账户编号=atoi(tok);
printf(“%i”,临时帐号);
tok=strtok(空,“,”);
strncopy(临时名字、tok、MAXBUFSIZE);
临时名字[MAXBUFSIZE]='\0';
tok=strtok(空,“,”);
strncopy(临时姓氏、tok、MAXBUFSIZE);
临时姓氏[MAXBUFSIZE]='\0';
tok=strtok(空,“,”);
温度账户余额=atof(tok);
printf(“临时账户余额=%.2f”,临时账户余额);
tok=strtok(空,“,”);
临时最后付款金额=atof(tok);
printf(“临时lastPaymentAmount=%.2f”,临时lastPaymentAmount);
tok=strtok(空,“,”);
printf(“\n”);
memcpy(&myarray[LOOPNUMBER]、&temp、sizeof(accounts));
}
if((fpData=fopen(“accounts.dat”、“wb”))==NULL)
{
printf(“无法打开文件。\n”);
}
其他的
{
对于(i=0;i<10;i++)
{
fwrite(myarray,sizeof(accounts),10,fpData);
}
}
fclose(fpData);
}
这是一个简短的回答,你真的需要检查你的代码,strtoks太多了
但主要的问题是这里…我已经得到了代码片段并更改了fwrite-请查看
if ((fpData = fopen("accounts.dat", "wb")) == NULL)
{
printf("File could not be opened.\n");
}
else
{
for (i = 0; i < 10; i++)
{
fwrite( &myarray[ i ], sizeof(accounts), 1, fpData );
}
}
if((fpData=fopen(“accounts.dat”、“wb”))==NULL)
{
printf(“无法打开文件。\n”);
}
其他的
{
对于(i=0;i<10;i++)
{
fwrite(&myarray[i],sizeof(accounts),1,fpData);
}
}
1)什么是strncopy()
?2)memcpy(&myarray[LOOPNUMBER],&temp,sizeof(accounts));
超出了myarray1的分配大小myarray[LOOPNUMBER]
:LOOPNUMBER
-->计数器索引(即0..9)2)fwrite(myarray,sizeof(accounts),10,fpData);fwrite(&myarray[i],sizeof(accounts),1,fpData);
或不使用循环。