2017-03-01 98 views
-1

因此,我打开一个文件,到最后看它是多久,然后回到开始导致分段错误(核心转储)。天哪?回卷文件后真的很奇怪的分段错误

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

回卷导致分段错误。它在开始的时候也是一样的。它为什么这样做?

+8

您**必须**检查您使用的所有四个函数的返回值。他们中的任何一个都可能失败,任何失败都可能导致段错误。 – DyZ

+0

你有没有检查你的pass.key文件是否存在? – soasme

+0

我做到了,一切都有效,直到倒带。我测试了这些返回的所有值,并且在所有这些测试之后放置printf语句来测试所有这些值,这是倒带。 – picklesrevil

回答

0

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

快乐编码!

+0

好的。正如评论中所述,我单独检查了所有功能。我知道pass.key存在,我让它存在。我已经完全验证了所有其他线路的工作。 – picklesrevil

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