我正在尝试使用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中,这将足够简单。对于每个1
,我都可以使用token[0]
访问Bob
,并使用token[1]
访问line
。但是在C语言中,我无法做到这一点。
出于测试目的,我现在要做的是打印每一行(在第二个while
循环中),只是为了查看每个拆分的外观。我尚未实现将每条分割线放入其相应的struct成员的代码。
我已经搜索了Stack Overflow,并找到了关于该主题的多个线程。除了我从中汲取的this one之外,他们似乎都没有帮助我。但是我无法使拆分列的存储正常工作。
答案 0 :(得分:1)
在python中,这很简单。对于每个
1
,我都可以使用token[0]
访问Bob
,并使用token[1]
访问line
。但是在C语言中,我无法做到这一点。
是的,只要定义数组就可以。
while (fgets(line, sizeof line, fp))
{
char *tmp = strchr(line, '\n');
if (tmp) *tmp = '\0'; // remove the '\n'
tmp = strdup(line);
#define MAXCOLUMNS 2
char *token[MAXCOLUMNS];
int c = 0;
while (tmp)
{
if (c == MAXCOLUMNS) puts("too many columns"), exit(1);
token[c++] = strsep(&tmp, ",");
}
if (1 <= c) printf("column 1: %s\n", token[0]);
if (2 <= c) printf("column 2: %s\n", token[1]);
// ONLY if the line's tokens are no longer needed:
free(*token);
}