用c语言解析CSV文件中的数据



我正试图解析我正在导入程序的CSV文件。我正在尝试使用strtok函数和while函数来检查每个读取每个令牌并将其分配给一个变量。

当我运行这段代码,没有错误:

void Import_and_Print()
{
printf("nPlace for importing files and printing results.nn");
FILE * fp;
char * line = NULL;
size_t len = 0;
ssize_t read;
int grade;
char csvData[] = "Student Name,Course_1,Course_2,Course_3,Course_4";
int i = 0;
const char s[2] = ",";
char *dataArr[7] = {0};
char *token;
token = strtok(csvData,s);
while (token != NULL) {
printf("%sn", token);
dataArr[i++] = token;
printf("Array entry %d:t%sn", i, dataArr[i]);
token = strtok(NULL, s);
}
}

然而,当我运行这段代码时,我得到了一些错误:

void Import_and_Print()
{
printf("nPlace for importing files and printing results.nn");
FILE * fp;
char * line = NULL;
size_t len = 0;
ssize_t read;
int grade;
fp = fopen("CTASample.csv", "r");
if (fp == NULL)
exit(EXIT_FAILURE);

read = getline(&line, &len, fp);
char csvDate[] = read;
int i = 0;
const char s[2] = ",";
char *dataArr[7] = {0};
char *token;
token = strtok(csvData,s);
while (token != NULL) {
printf("%sn", token);
dataArr[i++] = token;
printf("Array entry %d:t%sn", i, dataArr[i]);
token = strtok(NULL, s);
}
}

我得到的错误信息是:

Grades.c: In function ' Import_and_Print ':

Grades.c:37:22: error: invalid initializer 37 | char csvDate[] = read;

对于如何解决有什么建议吗?

您的代码中有一些错误可能是由于错误的复制粘贴。给你:

  1. csvDate是字符缓冲区。不要将read字节分配到缓冲区中。只需将line分配给csvData或直接使用line
char *csvDate = line;
  1. 对于free,您应该记住在函数结束时动态分配的line缓冲区。

  2. 在使用相同的索引之前,不要增加i

dataArr[i] = token;
printf("Array entry %d:t%sn", i, dataArr[i]);
i += 1;
  1. 假设csv最多有7列是你不能依赖的东西。尝试分配一个动态(重新)分配的数组来考虑具有更多列的行。

这一行有三处错误char csvDate[] = read;

  1. 包含一个错别字。您可能打算写csvData而不是csvDate,因为您的程序的其他部分也使用标识符csvData

  2. 如果你想复制一个字符串,你不能使用=(除非你在使用字符串文字初始化字符数组的声明中使用它)。您必须使用strcpy

  3. 在这种情况下,您不能简单地使用[]来使编译器确保分配了足够的内存来存储字符串。这只适用于在声明中使用字符串字面值初始化字符数组。

但是,正如在注释部分已经说明的那样,不需要复制字符串。您不需要两个单独的字符串csvDataline。您可以将line直接传递给strtok,并从程序中删除csvData。或者您可以在程序的任何地方将line重命名为csvData,这样您就只有一个字符串了。

另外,正如另一个答案所指出的,您在程序中的错误位置增加了i

此外,值得一提的是,您的程序包含内存泄漏和资源泄漏。您没有释放getline返回的内存,也没有关闭您打开的文件。

相关内容

  • 没有找到相关文章

最新更新