2014-11-05 87 views
0

我有點卡在這裏。C將大文本文件加載到數組中

我需要將大約200萬個固定長度的字符串加載到一個數組中,這些字符串都在一行文本文件中。 字符串是十六進制的,長度爲40個字符。

在ansi c中完成此操作的最佳方法是什麼?

查找速度很重要。

加載字符串後,我必須搜索整個數組以查找循環生成的匹配。

我有兩個文件可以說一個bigfile和hugefile,都包含十六進制值(哈希),我循環通過巨大的文件與此代碼。

.... 
FILE *file; 
if ((file = fopen(filenamein, "r")) == 0) 
{ 
    fprintf(stderr, "%s: failed to open file %s\n", argv[0], filenamein); 
    exit(1); 
} 
while (fgets(keyword, sizeof(keyword), file) != NULL) 
{ 
    if ((pos = strchr(keyword, '\n')) != NULL) 
     *pos = '\0'; 
    .... 
} 
.... 

之後需要在bigfile中查找關鍵字,lookuptime是一個關鍵因素。 從我迄今瞭解到的文件來看,這個文件對於堆棧來說很大。

+1

你必須通過數組來查看匹配什麼?完整的價值?你能詳細說明你在用這個數組做什麼,最好用一個例子嗎?它是真正的文本,你必須加載,或將數字表示(解析十六進制數字)嗎?你試過什麼了?什麼不起作用?你卡在哪裏?這是C問題還是C++問題? (這是兩種截然不同的語言......) – Cameron 2014-11-05 19:07:20

+0

如果是我,我會在找到文件的大小之後用一個fread來吸取它們。然後我會用qsort()對它們進行排序,然後用bsearch搜索它們。 – 2014-11-05 19:13:35

+0

你開始的很好,你能用這個文檔中的例子來進一步提高你嗎? http://msdn.microsoft.com/en-us/library/w0k41tbs.aspx – 2014-11-05 19:33:13

回答

1

根據您的特定需求,可能有一種方法可以在不將任何內容加載到內存中的情況下執行此操作。你沒有提供足夠的信息去沿着這條路走。

但是,假設您要將所有內容加載到內存中,我可能會嘗試將行轉換爲二進制。如果它們包含十六進制數字,那麼它們可能會轉換爲整數或長整數,或者可能是整數數組。整數將使用更少的內存,並且可以更快地進行比較以加快搜索速度。

另一種可能有意義的方法是對結果整數進行排序。即使你決定存儲字符串,對它們進行排序也是有意義的。排序的項目可以使用binary search algorithm進行搜索,這比蠻力搜索要快很多很多倍。

請注意,排序需要一些時間。因此,如果您計劃一次加載數據,然後多次快速搜索數據,那麼這種方法纔有意義。

+0

這將是一個非常大的數字。也許我只是加載字符串,使用'qsort()'進行排序,並使用'bsearch()'進行搜索。 – 2014-11-05 20:37:25

相關問題