2011-07-01 97 views
3

第一次在這裏發佈,谷歌搜索了幾個小時,我找不到任何東西。正確的方法來讀取C中的ELF文件

我想寫一個客戶端程序,讀取不同的文件,並通過網絡發送到服務器程序。 (用於備份。)

到目前爲止,我已經使用FREAD()把文件放到一個緩衝區,在某種程度上類似於此: http://www.cplusplus.com/reference/clibrary/cstdio/fread/

它工作正常的純文本文件,但是當我嘗試傳輸可執行文件時,fread()似乎沒有讀取文件,只將「ELF」讀入緩衝區。

我的問題是,什麼是正確的方法來讀取ELF文件的內容到C緩衝區?

謝謝。

+0

嗯。 ELF文件應該與其他文件沒有區別。你可以發佈一些代碼嗎? – IDWMaster

+4

聽起來像你已經在文本模式而不是二進制打開文件。 – tinman

+0

也許你的應用程序讀取文件的一些示例代碼?對於使用普通文件I/O的二進制文件沒有「提示和技巧」(除了將整個文件讀入內存通常是不合理的)。 –

回答

0

讀取二進制文件的正確方法是使用fread()。但請記住,您不能將內容視爲字符串,這意味着(除其他外)不能使用strlen()來確定它們的長度。

相反,您必須將長度保持在一個單獨的變量中。返回值fread()會告訴您成功讀取了多少條記錄 - 如果您將記錄大小設置爲1(第二個參數爲fread()),那麼它將返回讀取的字節數。

2

處理ELF文件的最佳方式是使用ELF庫(libelf; Google知道它),假設它可用於您。 ELF文件具有精巧的結構,並且該庫通常可以更輕鬆地處理這些文件。

如果您必須使用fread(),那麼只要您認識到數據充滿空字符或零字節,並且普通字符串函數由於數據爲零而不能準確處理數據,它就會正常工作。特別是,printf()等函數會停止在第一個零字節處打印字符串。您只需打開文件(以二進制模式;它對Unix沒有危害,對Windows非常重要),並將大塊讀入內存並再次寫出:

/* Copy the rest of f1 to f2 */ 
void fcopy(FILE *f1, FILE *f2) 
{ 
    char   buffer[BUFSIZ]; 
    size_t   n; 

    while ((n = fread(buffer, sizeof(char), sizeof(buffer), f1)) > 0) 
    { 
     if (fwrite(buffer, sizeof(char), n, f2) != n) 
      err_syserr("write failed\n"); 
    } 
} 

err_syserr()功能是報告在它的參數(一個或多個)給定的誤差,並增加了系統錯誤消息(strerror(errno))並退出一個簡單的錯誤報告功能。

相關問題