重写文件后真的很奇怪的分段错误

时间:2017-03-01 23:57:18

标签: c core fseek

所以我打开一个文件,到最后查看它有多长,然后回到开头导致分段错误(核心转储)。什么天啊?

...
FILE *passkey;
passkey = fopen("pass.key", "r+");
fseek(passkey, 0, SEEK_END);
filesize = ftell(passkey);
rewind(passkey);
...

倒带会导致分段错误。它与开头的fseek一样。为什么这样做?

2 个答案:

答案 0 :(得分:0)

C中的fseek函数的seg错误几乎总是由fopen失败引起的。确保您尝试打开的文件确实存在。如果你有可能依靠r +参数为你创建一个新文件,那么你就错了,r + 在C中创建一个新文件。尽可能尝试验证fopen的返回值。万一你不知道倒带只是一个fseek到文件的开头,这就是为什么你也可能在那里遇到问题。希望这有帮助!

快乐的编码!

答案 1 :(得分:0)

这更像是一个扩展的评论,而不是一个正确的答案。以下是您的代码必须的样子:

FILE *passkey;
if (!(passkey = fopen("pass.key", "r+")) {
    perror("pass.key");
    exit(EXIT_FAILURE);
}
if(-1 == fseek(passkey, 0, SEEK_END)) {
    perror("pass.key");
    exit(EXIT_FAILURE);
}
if(-1 == (filesize = ftell(passkey)) {
    perror("pass.key");
    exit(EXIT_FAILURE);
}
rewind(passkey);

这段代码很可能没有到达最后一行。但如果确实如此,则问题必定在其他地方。然后我建议使用内存调试器(例如valgrind或Electric Fence)运行程序。