因此,我打開一個文件,到最後看它是多久,然後回到開始導致分段錯誤(核心轉儲)。天哪?回捲文件後真的很奇怪的分段錯誤
...
FILE *passkey;
passkey = fopen("pass.key", "r+");
fseek(passkey, 0, SEEK_END);
filesize = ftell(passkey);
rewind(passkey);
...
回捲導致分段錯誤。它在開始的時候也是一樣的。它爲什麼這樣做?
因此,我打開一個文件,到最後看它是多久,然後回到開始導致分段錯誤(核心轉儲)。天哪?回捲文件後真的很奇怪的分段錯誤
...
FILE *passkey;
passkey = fopen("pass.key", "r+");
fseek(passkey, 0, SEEK_END);
filesize = ftell(passkey);
rewind(passkey);
...
回捲導致分段錯誤。它在開始的時候也是一樣的。它爲什麼這樣做?
C中的fseek函數的seg故障幾乎總是由失敗的fopen引起的。確保您嘗試打開的文件確實存在。如果有一些機會,你依靠r +參數爲你創建一個新文件,那麼你錯了,r + 不會在C中創建一個新文件。儘可能嘗試驗證fopen的返回值。以防萬一你不知道倒帶只是一個文件的開始,所以你也可能在那裏遇到問題。希望這可以幫助!
快樂編碼!
好的。正如評論中所述,我單獨檢查了所有功能。我知道pass.key存在,我讓它存在。我已經完全驗證了所有其他線路的工作。 – picklesrevil
這更像是一個擴展的評論,而不是一個正確的答案。下面是你的代碼必須樣子:
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)運行程序。
您**必須**檢查您使用的所有四個函數的返回值。他們中的任何一個都可能失敗,任何失敗都可能導致段錯誤。 – DyZ
你有沒有檢查你的pass.key文件是否存在? – soasme
我做到了,一切都有效,直到倒帶。我測試了這些返回的所有值,並且在所有這些測試之後放置printf語句來測試所有這些值,這是倒帶。 – picklesrevil