好的,这可能是一个经典的问题,我很抱歉把它带回来。我正在对文件进行标记,一切似乎都很好。当我打印文件时,它只打印我抓取的最后2个令牌。我曾尝试使用谷歌搜索这个问题,但我对谷歌搜索不够好,将结果缩小到这个非常具体的问题。解决方案的链接非常有用......
artist_in = fopen("artist.txt", "r");
cd_in = fopen("cd.txt", "r");
track_in = fopen("track.txt", "r");
if (artist_in == NULL || cd_in == NULL || track_in == NULL) {
fprintf(stderr, "ERROR: did not successully open files\n");
exit(1);
} else {
fprintf(stderr, "Successfully opened files\n");
}
while(fgets(buffer, BUFF_SIZE, artist_in) != NULL) {
token = strtok(buffer, DELIMS);
while(token != NULL) {
artistTokens[i++] = token;
token = strtok(NULL, DELIMS);
tokenCount++;
}
}
for (i = 0; i < tokenCount; i++) {
printf ("%s\n", artistTokens[i]);
}
输出是:
Successfully opened files
4
Melanie C
4
Melanie C
4
Melanie C
4
Melanie C
文件包含:
1|Pink Floyd
2|Genesis
3|Einaudi
4|Melanie C
正在使用的分隔符为'|'
这让我感到震惊。我对纯C不太熟悉。我可以在C ++中轻松完成。任何人都可以解释为什么会这样吗?
答案 0 :(得分:3)
您对文件的每一行使用相同的buffer
,因此每次读取新行时,该行上的标记将覆盖前一行的标记。使用strdup()
制作令牌的副本。
artistTokens[i++] = strdup(token);
由于这会使用malloc()
执行动态分配,因此您需要在完成令牌后释放它们。