【发布时间】:2011-04-02 05:23:37
【问题描述】:
我正在编写一个程序,它读取和解析 CSV 文件,用 CSV 文件的内容填充结构,然后以二进制模式将结构写入文件。我正在解析 csv 文件,方法是对其进行标记并将每个标记写入结构。 问题是当我尝试将此结构写入数据文件时,文件内容显示一些特殊字符,即它写入任何随机值。我附上了我的 output.dat 文件。 谁能帮我找到我错的地方?谢谢。
这是我的代码:
typedef struct
{
int AccountNumber;
char *AccountName;
double AccountBalance;
double LastPaymentAmount;
char *LastPaymentDate;
} Person;
FILE *fpData;
Person temp = {0,"",0,0,0};
if ( ( fpData = fopen( "input.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, ",");
temp.AccountName = tok;
printf("%s ",temp.AccountName );
tok = strtok(NULL, ",");
temp.AccountBalance = atof(tok);
printf("temp.AccountBalance = %f ",temp.AccountBalance );
tok = strtok(NULL, ",");
temp.LastPaymentAmount = atof(tok);
printf("temp.LastPaymentAmount = %f ",temp.LastPaymentAmount );
tok = strtok(NULL, ",");
temp.LastPaymentDate = tok;
printf("temp.LastPaymentDate = %s ",temp.LastPaymentDate );
tok = strtok(NULL, ",");
printf("\n");
// }
}
if ( ( fpData = fopen( "output.dat", "wb" ) ) == NULL )
{
printf( "File could not be opened.\n" );
}
else
{
printf("\nFileName is:%s\n",argv[2]);
printf("File will be overwritten. Do you want to continue?\nPress Y if yes, N if no");
printf("\n?\n");
scanf("%c", &choice);
if(choice=='Y')
{
for(i=0;i<10;i++)
{
fwrite(&temp, sizeof(temp), 10, fpData);
}
}
}
fclose(fpData);
【问题讨论】:
-
你似乎遗漏了一些代码...... 1)你只分配了
Person的一个实例,即堆栈上的变量temp——不应该有一个数组还是某种类型的内存指针,指向堆上的Person结构数组,您将从文件中读取的每个内容保存到其中? 2)buf的分配在哪里,BUFFER_SIZE的定义是什么? 3)我假设您的所有调试信息都正确打印出来(即,您实际上正确标记了文件)? -
是的。标记化正在使用 CSV 文件中的 10 个条目正确填充结构。但是当我将其写入文件时,它只会使用一些特殊字符写入最后一个条目。
-
请注意,RFC 4180 为 CVS 提供了一个比您的分词器处理的更复杂的定义。如果保证输入是您的代码期望的简单形式,那不是灾难,但如果您将从符合 RFC 4180 的源接收数据,则可能会出现问题。见this recent question。