繁体   English   中英

文件关闭时检测到堆栈粉碎

[英]Stack smashing detected on file closing

我不明白为什么它会出错。 尽管从文件中读取的一切都很好。 检测到错误 *** 堆栈粉碎 ***:终止中止(核心转储)。

{
    FILE *set = fopen("data.bin", "rb");
    if (set == NULL) {
        fprintf(stderr, "I/O ERROR: Can't read from file.\n");
        exit(1);
    }
    int number;
    Enrollee e;
    fread(&number, sizeof(number), 1, set);
    for (int i = 0; i < number; i++) {
        if (fread(&(e.id)           , sizeof(e.id)           , 1       , set) != 1       ) { fprintf(stderr, "I/O ERROR: Something went wrong! Failed to read, possibly out of memory\n"); exit(3); };
        if (fread(&(e.surname)      , sizeof(e.surname)      , STR_SIZE, set) != STR_SIZE) { fprintf(stderr, "I/O ERROR: Something went wrong! Failed to read, possibly out of memory\n"); exit(3); };
        if (fread(&(e.initials)     , sizeof(e.initials)     , STR_SIZE, set) != STR_SIZE) { fprintf(stderr, "I/O ERROR: Something went wrong! Failed to read, possibly out of memory\n"); exit(3); };
        if (fread(&(e.gender)       , sizeof(e.gender)       , 6       , set) != 6       ) { fprintf(stderr, "I/O ERROR: Something went wrong! Failed to read, possibly out of memory\n"); exit(3); };
        if (fread(&(e.schoolNumber) , sizeof(e.schoolNumber) , 1       , set) != 1       ) { fprintf(stderr, "I/O ERROR: Something went wrong! Failed to read, possibly out of memory\n"); exit(3); };
        if (fread(&(e.medal)        , sizeof(e.medal)        , 1       , set) != 1       ) { fprintf(stderr, "I/O ERROR: Something went wrong! Failed to read, possibly out of memory\n"); exit(3); };
        if (fread(&(e.essayResults) , sizeof(e.essayResults) , 1       , set) != 1       ) { fprintf(stderr, "I/O ERROR: Something went wrong! Failed to read, possibly out of memory\n"); exit(3); };
        if (fread(&(e.math)         , sizeof(e.math)         , 1       , set) != 1       ) { fprintf(stderr, "I/O ERROR: Something went wrong! Failed to read, possibly out of memory\n"); exit(3); };
        if (fread(&(e.language)     , sizeof(e.language)     , 1       , set) != 1       ) { fprintf(stderr, "I/O ERROR: Something went wrong! Failed to read, possibly out of memory\n"); exit(3); };
        if (fread(&(e.fisics)       , sizeof(e.fisics)       , 1       , set) != 1       ) { fprintf(stderr, "I/O ERROR: Something went wrong! Failed to read, possibly out of memory\n"); exit(3); };
        if (fread(&(e.informatics)  , sizeof(e.informatics)  , 1       , set) != 1       ) { fprintf(stderr, "I/O ERROR: Something went wrong! Failed to read, possibly out of memory\n"); exit(3); };
        if (fread(&(e.history)      , sizeof(e.history)      , 1       , set) != 1       ) { fprintf(stderr, "I/O ERROR: Something went wrong! Failed to read, possibly out of memory\n"); exit(3); };
        if (fread(&(e.socialScience), sizeof(e.socialScience), 1       , set) != 1       ) { fprintf(stderr, "I/O ERROR: Something went wrong! Failed to read, possibly out of memory\n"); exit(3); };
        if (fread(&(e.biology)      , sizeof(e.biology)      , 1       , set) != 1       ) { fprintf(stderr, "I/O ERROR: Something went wrong! Failed to read, possibly out of memory\n"); exit(3); };
        if (fread(&(e.chemistry)    , sizeof(e.chemistry)    , 1       , set) != 1       ) { fprintf(stderr, "I/O ERROR: Something went wrong! Failed to read, possibly out of memory\n"); exit(3); };
        printf("%d %.20s %.3s %.2s %d %c %c %d %d %d %d %d %d %d %d\n",
        e.id,
        e.surname,
        e.initials,
        e.gender,
        e.schoolNumber,
        e.medal,
        e.essayResults,
        e.math, e.language, e.fisics, e.informatics, e.history, e.socialScience, e.biology, e.chemistry);
    }
    fseek(set, 0, 0);
    fclose(set);
}

你所有的字符串读数都是错误的。

fread(&(e.gender)       , sizeof(e.gender)       , 6       , set)

说:阅读6个元素。 每个元素都是sizeof(e.gender)字节。

由于gender是一个数组,即char gender[6]sizeof(e.gender)返回 6。

所以你的代码读取 6 * 6 = 36 个字节。 你只想要6个。

做:

fread(&(e.gender)       , sizeof(char)       , 6       , set)

或更好

fread(&(e.gender)       , sizeof(gender[0])       , sizeof(gender)       , set)

这适用于你所有的字符串。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM