我正试图解析我正在导入程序的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;
对于如何解决有什么建议吗?
您的代码中有一些错误可能是由于错误的复制粘贴。给你:
csvDate
是字符缓冲区。不要将read
字节分配到缓冲区中。只需将line
分配给csvData
或直接使用line
。
char *csvDate = line;
对于
free
,您应该记住在函数结束时动态分配的line
缓冲区。在使用相同的索引之前,不要增加
i
。
dataArr[i] = token;
printf("Array entry %d:t%sn", i, dataArr[i]);
i += 1;
- 假设csv最多有7列是你不能依赖的东西。尝试分配一个动态(重新)分配的数组来考虑具有更多列的行。
这一行有三处错误char csvDate[] = read;
包含一个错别字。您可能打算写
csvData
而不是csvDate
,因为您的程序的其他部分也使用标识符csvData
。如果你想复制一个字符串,你不能使用
=
(除非你在使用字符串文字初始化字符数组的声明中使用它)。您必须使用strcpy
。在这种情况下,您不能简单地使用
[]
来使编译器确保分配了足够的内存来存储字符串。这只适用于在声明中使用字符串字面值初始化字符数组。
但是,正如在注释部分已经说明的那样,不需要复制字符串。您不需要两个单独的字符串csvData
和line
。您可以将line
直接传递给strtok
,并从程序中删除csvData
。或者您可以在程序的任何地方将line
重命名为csvData
,这样您就只有一个字符串了。
另外,正如另一个答案所指出的,您在程序中的错误位置增加了i
。
此外,值得一提的是,您的程序包含内存泄漏和资源泄漏。您没有释放getline
返回的内存,也没有关闭您打开的文件。