2017-06-14 37 views
-1

我想通過更改某些文本從第6個字節到第20個字節,如下面的代碼中所述自定義type1字體文件的標頭。代碼給出錯誤分段錯誤(核心轉儲),如果位置已更改

當前字體文件包含6-20字節「%!PS-AdobeFont」中的此文本,我將它修改爲「%!PS-RoughFont」。它工作正常,但只要我安裝所有字體安裝在字體文件夾這個字體文件並運行相同的代碼,它給我的錯誤「分割故障(核心轉儲)

這是爲什麼錯誤來了我意味着在其他位置工作的相同代碼。我正在使用linux操作系統。是否這個目錄的權限,因爲它只允許讀取權限。

代碼

#include <stdio.h> 

int main() 
{ 
FILE *fp; 

fp = fopen("/usr/share/fonts/type1/gsfonts/test.pfb","r+"); 

fseek(fp, 6, 0); 
fputs("%!PS-AdobeFont", fp); 
fclose(fp); 

return(0); 
} 
+0

顯然,如果該目錄下的*只允許讀權限*您無法打開文件** **寫它。 *讀取權限*表示您可以*讀取*,而不是*寫入*。所以'fopen()'調用失敗了,並且文件沒有打開寫入,但是你仍然繼續寫下去,寫入一個無效的文件指針。你應該學習a)檢查函數結果,而不是假設他們工作,並b)現在學會使用調試器。 –

+0

@KenWhite實際上該文件具有root用戶可以寫入的權限,我試着用sudo命令嘗試它,同時編譯它仍然失敗。 –

+0

@KenWhite謝謝你的評論幫助sudo爲我做了這個訣竅。 –

回答

0

您可能沒有寫權限。

使用此代碼,包括錯誤檢查,看看是什麼問題:

#include <stdlib.h> 
#include <stdio.h> 

int main(void) 
{ 
    FILE* fp = fopen("/usr/share/fonts/type1//gsfonts/test.pfb", "r+"); 
    if(!fp) 
    { 
     perror("Error"); 
     return EXIT_FAILURE; 
    } 

    fseek(fp, 6, 0); 
    fputs("%!PS-AdobeFont", fp); 
    fclose(fp); 
}