[英]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.