2017-03-01 82 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)運行程序。