2013-03-04 39 views
0

我使用realloc來動態增加字符指針(* seqA)的大小。還有另一種方法可以做得更好嗎?如何動態改變字符指針大小?

這是我的代碼部分:

while((holder=fgetc(fileA)) != EOF) { 
    lenA++; 
    temp=(char*)realloc(seqA,lenA*sizeof(char)); 
    if (temp!=NULL) { 
     seqA=temp; 
    seqA[lenA-1]=holder; 
    } 
    else { 
     free (seqA); 
     puts ("Error (re)allocating memory"); 
     exit (1); 
    } 
} 
+0

什麼是'seqA'是它的動態分配? – 2013-03-04 12:09:14

+3

你可以做什麼(提高執行速度並減少內存碎片)是**最小化**重新分配的次數。例如,每次加倍緩衝區大小並跟蹤邏輯緩衝區的結束位置。 – 2013-03-04 12:11:05

+0

出於興趣,做'* sizeof(char)'從來沒有任何意義 - 根據定義,這是1。字符在不同的系統中可以有不同的位數,但sizeof仍然是1. – Vicky 2013-03-04 12:21:04

回答

1

當你的代碼正在讀取完整的文件轉換成字符串,爲什麼不使用下面的代碼:

#include <sys/types.h> 
#include <sys/stat.h> 
#include <unistd.h> 

.... 

struct stat buf; 
fstat(fileno(fileA), &buf); 
seqA = malloc(buf.st_size); 
fread(seqA, buf.st_size, 1, fileA); 

當然,你應該檢查返回這些函數的值並採取適當的行動。

+1

我希望我能給出這個答案我的批准,但由於以下原因,我不能:1.這個問題沒有提到POSIX,並且fstat在標準C中不存在。2.即使這是在POSIX C環境中編譯的,off_t(buf.st_size的類型)可能會表示比size_t更高的值fread第二個參數的類型)。如果發生這種情況,該代碼可能無法讀取整個文件。 3.即使在POSIX C環境下編譯,並且size_t可以表示off_t的所有正值,但可能將2GB讀入數組似乎是荒謬的! – Sebivor 2013-03-04 14:21:58

+0

我在做一些假設。至於OP將它讀入內存的潛在文件大小,人們可以認爲正在讀取的文件不會那麼大。 'fstat'可以使用'fseek'來解決。 – 2013-03-04 21:31:12

0

爲什麼問你的算法的這麼小的一部分?對整個算法進行更全面的考察可能是一個更好的主意。你目前的算法取決於這個相當密集和不必要的代碼。如果您可以刪除將整個文件讀入內存的這種依賴性,那麼您的解決方案將更具可擴展性。也許通過「更好地做到這一點」,你的意思是「更快」或「因此我可以處理大小爲100GB的文件,而不會停止爬行」。

考慮一個finite state machine,它可以從您的文件中一次讀取,處理和提取所需的信息。你可能不會需要malloc這麼多。如果沒有關於您的問題的具體描述,我們無法幫助您推導出有限狀態機來解決您的問題。然而,突出一個例子可能是一個100GB的文件中查找的最大整數:

while (fscanf(file, "%d", &current_num) == 1) { 
    if (current_num > max_num) { 
     max_num = current_num; 
    } 
} 

此代碼顯然並不需要的malloc,更不用說整個文件讀入內存;無論文件大小如何,它只會使用恆定的內存量。