文件标记无法正确打印

时间:2015-11-14 20:09:44

标签: c

好的,这可能是一个经典的问题,我很抱歉把它带回来。我正在对文件进行标记,一切似乎都很好。当我打印文件时,它只打印我抓取的最后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 ++中轻松完成。任何人都可以解释为什么会这样吗?

1 个答案:

答案 0 :(得分:3)

您对文件的每一行使用相同的buffer,因此每次读取新行时,该行上的标记将覆盖前一行的标记。使用strdup()制作令牌的副本。

artistTokens[i++] = strdup(token);

由于这会使用malloc()执行动态分配,因此您需要在完成令牌后释放它们。