Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
解析csv文件,填充结构并写入二进制数据文件_C_Parsing_Csv_Struct - Fatal编程技术网

解析csv文件,填充结构并写入二进制数据文件

解析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

我正在尝试读取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_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);
或不使用循环。