【发布时间】:2019-02-21 06:42:53
【问题描述】:
我正在尝试使用 C 来读取 CSV 文件,逐行迭代(直到 EOF),并用逗号分隔/分割每一行。然后我希望将每一列分成“bins”并根据类型将它们添加到一个结构(这里没有显示;我在帮助文件中定义它)。
例如,如果我有1,Bob,我想将1 和Bob 拆分为两个变量。这是我到目前为止所写的内容。
void readFile(char file[25]) {
FILE *fp;
char line[1000];
fp = fopen(file, "r"))
while(fgets(line, 1000, fp)) {
char* tmp = strdup(line);
char* token;
while((token = strsep(&tmp, ","))) {
printf("%s\n", token); // I want to split token[0] and token[1]
}
}
fclose(fp);
}
上面的代码确实可以编译和运行。我只是不知道如何访问token 的每个拆分,例如token[0] 或token[1]。在 python 中,这很简单。对于每个line,我可以使用token[0] 和Bob 使用token[1] 访问1。但是在 C 中,我不能这样做。
出于测试目的,我现在所做的只是打印每一行(在第二个while 循环中),只是为了查看每个拆分的外观。我还没有实现将每个分割线放入其各自结构成员的代码。
我搜索了 Stack Overflow 并找到了大量关于此主题的主题。除了this one,他们似乎都没有帮助我,我从中汲取了。但我无法让拆分列的存储工作。
【问题讨论】:
-
如果不出意外,您的代码中存在内存泄漏。不要忘记
strdup将您需要的内存分配给free。 -
我会调查
strtok。我以前就是这样做的。 -
我将在我的代码中进行哪些更改以使其与
strtok一起使用?通过阅读一些文档,它看起来与strsep的格式大致相同。我也可以得到第二块文本,还是一次只给出一个文本块(或令牌)? -
此外,没有法律或法令规定 CSV 行的长度必须少于 1000 个字符...如果您使用的是 POSIX,请考虑改用
getline!如果您复制每个字段或在那里解析它们,您可能不需要strdup行...