如何从文本文件加载CSV以正确构造C?
问题描述:
我有一个由“|”分隔的单词和数字文件我需要将它们加载到一个结构体中,以便稍后使用它们。这是一个国家,它们的货币和汇率的文件,我需要把它们分解成一个结构,然后和它们一起工作。基本上我需要创建一个C货币交换程序。如何从文本文件加载CSV以正确构造C?
数据在文件中是这样的:
country|currency|quantity|code|rate of exchange
Canada|dollar|1|CAD|19,430
这是结构的样子(FILE * currencies = fopen("denni_kurz.txt", "r"))
:
struct data
{
char buffer[100];
char country[40];
char nameofcurrency[20];
int quantity;
char code[5];
float exchangerate;
}currency[40];
然后,我有一个循环加载所有的人:
while (!feof(currencies))
{
}
这里的问题是,我阅读文档,但它只是不适合我。 任何人都可以给我一个关于如何加载他们属于他们的提示吗?
答
您可以使用sscanf函数加载CSV文件。默认情况下,sscanf()会将空格作为分隔符。你可以指定|在sscanf中并将其存储在结构中。 首先使用fgets从csv文件获取行并将其存储在数组中。 然后获取数组中的行并存储在结构中。
eg: while(fgets(array,BUFSIZ,fp) != NULL)
sscanf(array," %d | %s | %s | %d | %d | %s | %f | %[0-9]s",&account[i].customer_id,account[i].name,account[i].address,&account[i].account_number,&account[i].age,account[i].sex,&account[i].balance_amount,account[i].mobile_number);
然后,如果您打印结构变量将打印相应的值。
printf("id:%d\n name:%s\n address:%s\n account number:%d\n age:%d\n sex:%s\n balance:%f\n mobile:%s\n",account[j].customer_id,account[j].name,account[j].address,account[j].account_number,account[j].age,account[j].sex,account[j].balance_amount,account[j].mobile_number);
答
如果没有什么帮助,你可以随时恢复到愚蠢cahracter处理,如:线
struct data *p= currency;
while (fgets(p->buffer,100, currencies)) {
char *cp1= p->buffer;
char *cp2= p->buffer;
while (*cp2!='|') cp2++;
strncpy(p->country, cp1, cp2-cp1); p->country[cp2-cp1]='\0';
cp2++; cp1=cp2;
// etc....
p++; // next line
}
当然,你还需要添加相应的检查(不处理过去的结束,没有结束货币阵列,而不是国家名称太长,不...)
+0
谢谢你的建议,我通过strncpy,strtok,atoi和atof工作。 – greav 2014-12-06 15:34:21
'while(!feof(currency))'''不好主意。 – BLUEPIXY 2014-12-06 10:46:02
是否使用“缓冲区”?我不明白19,430的汇率。它不应该像1.14那样?或者逗号用作小数点? – Marichyasana 2014-12-06 11:14:26
这是一个小数点,是的。我以为我会读整个东西,加载到缓冲区,然后用strtok把它分解成小块,但它不适合我,所以我做错了什么。 – greav 2014-12-06 11:16:41