C程序在41秒后给出分段错误

时间:2015-11-13 13:46:38

标签: c segmentation-fault

我正在编写一个程序来将文件解析为另一种格式。 输入文件大小为20Gb,所以我转向C进行解析,但是当我的输出文件达到4.3Gb(大约是41秒标记)时,程序会出现分段错误。

当拖尾输出文件时,它向我显示它已经停止在写入中间输出。

输入文件位于ftp://ftp.uniprot.org/pub/databases/uniprot/current_release/knowledgebase/idmapping/,文件压缩为idmapping.dat.gz

程序应该解析整个文件,而不仅仅是分段错误。

int main()
{
    char line[256];
    char placeholdertoken[256];
    char placeholderline[256];
    char *token1, *token2, *token3;
    char *chdup;
    char *tab, *newline, *semicolom, *empty;
    FILE *fp;
    FILE *fs;
    fp = fopen("idmapping.dat", "r");
    fs = fopen("parsedidmapping.dat", "w");

    if( fp == NULL )
    {
        perror("Error while opening the file.\n");
        exit(EXIT_FAILURE);
    }

    strcpy(tab,"\t");
    strcpy(newline,"\n");
    strcpy(semicolom,";");
    strcpy(empty,"");
    strcpy(placeholdertoken,"");

    while (fgets(line, sizeof(line), fp) != NULL)
    {

    token1 = strtok(line, "\t");
    token2 = strtok(NULL, "\t");
    token3 = strtok(NULL, "\n");

    if (strcmp(token1, placeholdertoken) == 0) {
        strcat(placeholderline, token2);
        strcat(placeholderline, semicolom);
        strcat(placeholderline, token3);
        strcat(placeholderline, tab);
    }
    else {
        strcat(placeholderline, newline);
        strcpy(placeholdertoken,token1);
        fputs(placeholderline, fs);
        strcpy(placeholderline, empty);
        strcat(placeholderline, token1);
        strcat(placeholderline, tab);
        strcat(placeholderline, token2);
        strcat(placeholderline, semicolom);
        strcat(placeholderline, token3);
        strcat(placeholderline, tab);
        }
    }

    fclose(fs);
    fclose(fp);
    return 0;
}

2 个答案:

答案 0 :(得分:2)

您的placeholdertoken[]未初始化。您的placeholderline未分配任何内存。

我很惊讶它正在41秒运行。

答案 1 :(得分:1)

您写入placeholderline这是一个未初始化的指针。这是未定义的行为。

在写信之前,您还阅读了placeholdertoken