【问题标题】:How to load CSV from a text file to structure in C properly?如何将 CSV 从文本文件加载到 C 中正确的结构?
【发布时间】:2014-12-06 10:28:33
【问题描述】:

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

}

这里的问题是我阅读了文档,但它对我不起作用。 谁能告诉我如何将它们加载到它们所属的位置?

【问题讨论】:

  • while (!feof(currencies)) 坏主意。
  • 没有使用“缓冲区”吗?我不明白 19,430 的汇率。不应该是1.14之类的吗?还是用逗号作为小数点?
  • 是小数点,是的。我以为我会阅读整个内容,加载到缓冲区中,然后使用 strtok 将其分解成更小的部分,但它对我不起作用,所以我做错了。

标签: c file csv struct


【解决方案1】:

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

【讨论】:

  • 试过了,但它并没有真正起作用,我得到了一些数据,然后是很多随机符号。
  • 我使用 sscanf 上传 csv 文件。并且文件已上传。这就是为什么我建议你使用。可以发一下你用过的sn-p吗?
【解决方案2】:

如果没有任何帮助,您可以随时恢复到愚蠢的字符处理,例如:

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
}

当然,您仍然需要添加适当的检查(不处理行尾,不处理货币数组的结尾,不是国家名称太长,不是......)

【讨论】:

  • 感谢您的建议,我通过 strncpy、strtok、atoi 和 atof 得到了它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-06
相关资源
最近更新 更多