C 倒带文件后出现了非常奇怪的分段错误

C 倒带文件后出现了非常奇怪的分段错误,c,core,fseek,C,Core,Fseek,所以我打开一个文件,走到末尾看看它有多长,然后回到开头会导致分段错误(核心转储)。什么鬼东西 ... FILE *passkey; passkey = fopen("pass.key", "r+"); fseek(passkey, 0, SEEK_END); filesize = ftell(passkey); rewind(passkey); ... 倒带导致分段错误。它从一开始就对fseek执行相同的操作。为什么会这样做?C中fseek函数的seg故障几乎总是由fopen故障引起的。确保您

所以我打开一个文件,走到末尾看看它有多长,然后回到开头会导致分段错误(核心转储)。什么鬼东西

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

倒带导致分段错误。它从一开始就对fseek执行相同的操作。为什么会这样做?

C中fseek函数的seg故障几乎总是由fopen故障引起的。确保您试图打开的文件确实存在。如果您碰巧依赖r+参数为您创建新文件,那么您就错了,r+不会用C创建新文件。请尽可能验证fopen的返回值。以防万一,您没有意识到倒带只是一个fseek,它会转到文件的开头,这就是为什么您可能也会在那里遇到问题的原因。希望这有帮助


快乐编码

这更像是一个延伸的评论,而不是一个恰当的答案。下面是您的代码必须的样子:

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)运行程序。

您必须检查您使用的所有四个函数的返回值。其中任何一个都可能失败,任何失败都可能导致SEGFULT。您是否检查过you pass.key文件是否存在?我检查过了,在倒带之前一切正常。我测试了这些返回的所有值,并在所有这些值之后放置printf语句来测试所有值,这是倒带。如果您甚至不保存返回值,您如何知道
fseek
返回了什么?发布您测试所有返回代码的实际代码。如果在所有这些事情都好了之后它真的失败了,那么你可能已经在你的程序的早期UB了OK。如评论中所述,我单独检查了所有函数。我知道密码是存在的,是我让它存在的。我已经完全验证了所有其他线路都正常工作。