2010-10-26 107 views
0

嘿,讓我們說我得到一個文件作爲第一個命令行參數。將文件讀取到char數組然後malloc大小。 (C)

int main(int argc, char** argv) { 
    unsigned char* fileArray; 

    FILE* file1 = fopen(argv[1], "r"); 
} 

現在我該如何去讀取該文件,char by char,到char* fileArray

基本上我怎麼可以轉換FILE*char*之前,我知道我需要多大的malloc char*

我知道一個可能的解決方案是使用一個緩衝,但在這裏我的問題是我處理文件可能有超過900000個字符,並且看不到它適合製作一個很大的緩衝區。

+0

你的意思是你不想要連續存儲位置中的字符? – Naveen 2010-10-26 07:02:43

回答

2

如果只有「真實」的文件(不流,設備,...)時,您可以使用stat/fstat或類似

int retval=fseek(file1,0,SEEK_END); // succeeded if ==0 (file seekable, etc.) 
long size=ftell(file1); // size==-1 would be error 
rewind(file1); 

事先獲得文件的大小。然後你可以malloc和讀取。 但由於file1可能在此期間發生變化,您仍然必須確保不會超出您的malloced尺寸。

1

有幾個辦法可以採取:

  • 指定您可以處理最大尺寸,那麼你只需要分配一次(無論是作爲一個全球性的或堆)。
  • 如果您擔心一次將所有內容裝入內存,則會以大塊的方式處理文件。
  • 通過使用mallocrealloc(當您讀取位時)處理任意大小。

1號很容易:

static char buff[900001];     // or malloc/free of 900000 
count = fread (buff, 1, 900001, fIn); 
if (count > 900000)      // problem! 

2號可能是做到這一點的最好辦法,除非你絕對需要內存中的整個文件一次。例如,如果您的程序計算單詞的數量,它可以一次按順序處理文件幾K。

編號3,您可以保留一個bufferusedmax變量。最初將max設置爲50K,並將buffer分配爲該大小。

然後嘗試讀取一個10K塊到固定緩衝區tbuff。將當前的used和讀入的字節數相加,並且如果大於max,則執行realloc以將buffer增加另一個50K(同時調整max)。

然後附加tbuffbuffer,調整used,沖洗並重復。請注意,所有這些值(10K,50K等)僅爲示例。根據您的需要,您可以使用不同的值。

相關問題