我不知道如何使用libcs​​v中某些函数的参数

时间:2015-01-06 22:33:23

标签: c pointers csv callback void

所以我有一个正在进行的项目,我正在尝试使用libcsv。 从doc开始,我了解到csv_parse()需要

"a pointer to a callback function (cb1) that will be called from csv_parse()
 after an entire field has been read. cb1 will be called with a pointer to the
 parsed data (which is NOT nul-terminated unless the CSV_APPEND_NULL option is 
set), the number of bytes in the data, and the pointer that was passed 
to csv_parse()."

我给csv_parse调用作为回调的函数(在读取现有文件时,并试图用它填充结构)是:

void cb1_db_populate(void *s, size_t len, void *data)
{
    int row = ((struct DB *)data)->currRow, field = ((struct DB *)data)->currField;
    str = (char *)s;
    printf("%s\n", str);
}

我不清楚如何使用 void *s ,因为我的数据库中有多种数据类型,例如char *int等...... 目前我只是希望能够正确打印它,我第一次调用该函数时已经工作的代码,但在那之后,字符串的问题(当然是char的数组)长度。

示例
2014年11月4日
07.5011-04
课程soirée
eversée
2014-11-05irée
30.5011-05irée
carburant5irée

如何知道指针隐藏在_void_后面,以及如何正确使用它(打印它,用它进行操作......)?

希望我很清楚,非常感谢你:)


我现在使用的解决方案为我提供了一个正确的字符串,我可以无错误地打印或在需要时传递给atoi()/ atof():

char *str = malloc(sizeof(char)*len);
memcpy(str, (char *)s, len);  
printf("%s\n", str);  

2 个答案:

答案 0 :(得分:1)

在第7页上链接到的文档中有一个很好的例子,说明了如何使用它。

回调函数cb1如下所示:

void cb1 (void *s, size_t len, void *data) {
}

所以你要传递一个指向void(*)(void*, size_t, void*)的指针。

编辑:

  

目前我只是希望能够正确打印出来   代码我第一次调用函数时有效,但之后   那个,字符串有问题(当然是char数组)   长度。

这些字符串不是以null结尾的,你不能像普通的cstrings一样将它们传递给printf。 请改为printf("%.*s\n", len, str);

  

我对如何使用void * s一无所知,因为我的数据库中有几种数据类型,比如char *和int等......

void *是指向csv_parser结构的数据字段的指针。它指向从文件/数据库读取的原始数据。 如果您的CSV包含文本,则此数据为文本,您可以将void *转换为char *。如果您的CSV包含以原始32位二进制格式编码的数字(因此,不是文本),那么您可以将该void *转换为uint32_t *。

大多数情况下,您可能希望将其作为char *来阅读,但您应该知道这些文件中的内容。所有解析器看到的都是一堆字节。

答案 1 :(得分:0)

您不需要使用void *s

但是如果你发现在回调函数中使用全局变量是一个坏主意,你可能会发现它在以后很有用。