簡體   English   中英

fseek和fread C編程

[英]fseek and fread C programming

編輯:謝謝大家的快速解答。 :)

好的,我是C語言的新手,我可以打開一個文件並將其設置為文件中的特定位置,並使用以下代碼讀取數據塊並將其寫入另一個文件:

#include <stdio.h>

int main (int argc, unsigned char *argv[])

  {

      FILE* in = fopen(argv[1], "rb");
      FILE* out = fopen("test.bin", "wb");

      unsigned char buffer[0x200];

      fseek(in, 0x8F00, SEEK_SET);
      fread(buffer, sizeof(buffer), 1, in);   
      fwrite(buffer, sizeof(buffer), 1, out);
  };


但是我很熟悉perl ,我可以輕松地查找文件中的任何位置並讀取像這樣的數據塊:

seek ( $file, 0x8F00, 0);
read ( $file, $buffer, 0x200);

如您所見,我不必在perl中預先聲明我的緩沖區大小,我可以在read函數本身中指定緩沖區。 無論如何,我完全可以在C中使用buffer而不用像在perl中那樣預先聲明它嗎?

無論如何,我完全可以在C中使用buffer而不用像在perl中那樣預先聲明它嗎?

沒有。

C是比Perl低的語言,並且沒有魔術般的自動調整大小的字符串,緩沖區或數組。 您的選擇是分配一個比預期的要大的巨大緩沖區,或者將文件逐步讀取到您需要調整大小的緩沖區中。

不,在C語言中,您需要預先提供緩沖區大小,然后將該緩沖區傳遞給fread函數。

但是,您無需指定恆定的緩沖區大小:您情況下的0x200大小可以在運行時計算出來,例如,通過檢查正在讀取的文件的大小來計算。

但是請注意,當程序動態選擇緩沖區的大小時,應將緩沖區放置在動態內存區域中,而不是將其保留在自動區域中(即,在堆棧上)。 當文件太大時,這可以避免堆棧溢出,因為對自動內存的限制通常比對動態內存的限制要嚴格得多。

您還可以編寫代碼來逐步填充緩沖區,並根據需要使用realloc對其進行擴展。 請參閱此答案以獲取動態擴展讀取緩沖區的示例。

不,至少不使用標准庫。

這是因為默認情況下C不會自動處理動態內存,因為這種控件留給用戶使用。

您可以輕松地轉到文件的末尾,讀取有多少字節,然后跳轉到您的位置,創建一個大小為file_size - file_location的緩沖區,並進行剩余文件讀取

fseek(in, 0L, SEEK_END);
file_size = ftell(fp);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM