2014-12-06 47 views
-2

我有一个由“|”分隔的单词和数字文件我需要将它们加载到一个结构体中,以便稍后使用它们。这是一个国家,它们的货币和汇率的文件,我需要把它们分解成一个结构,然后和它们一起工作。基本上我需要创建一个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)) 
{ 

} 

这里的问题是,我阅读文档,但它只是不适合我。 任何人都可以给我一个关于如何加载他们属于他们的提示吗?

+1

'while(!feof(currency))'''不好主意。 – BLUEPIXY 2014-12-06 10:46:02

+0

是否使用“缓冲区”?我不明白19,430的汇率。它不应该像1.14那样?或者逗号用作小数点? – Marichyasana 2014-12-06 11:14:26

+0

这是一个小数点,是的。我以为我会读整个东西,加载到缓冲区,然后用strtok把它分解成小块,但它不适合我,所以我做错了什么。 – greav 2014-12-06 11:16:41

回答

2

您可以使用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); 
+0

试过这个,但它并没有真正的工作,我得到一些数据,然后很多随机符号。 – greav 2014-12-06 12:22:19

+0

我已经使用sscanf上传csv文件。并且文件已经上传。那为什么我建议你使用。你可以发布你使用过的代码片段吗? – sharon 2014-12-06 13:20:17

0

如果没有什么帮助,你可以随时恢复到愚蠢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