2016-11-13 56 views
-1

我有一段代碼讀取文件,但文件很小,並將它們分成較小的文件。我想讓這段代碼讀取大小爲32 GB或更大的文件,並支持不同類型的數據類型文件,希望尋找答案以幫助?如何使用C分割大文件32 GB或更多?

#include <stdio.h> 
int main(){ 

    FILE *ptr_readfile; 
    FILE *ptr_writefile; 
    char line [128]; /* or some other suitable maximum line size */ 
    char fileoutputname[15]; 
    int filecounter=1, linecounter=1; 

    ptr_readfile = fopen("editing for the java lab 2.txt","r"); 
    if (!ptr_readfile) 
     return 1; 

    sprintf(fileoutputname, "file_part%d", filecounter); 
    ptr_writefile = fopen(fileoutputname, "w"); 

    while (fgets(line, sizeof line, ptr_readfile)!=NULL) { 
     if (linecounter == 5) { 
      fclose(ptr_writefile); 
      linecounter = 1; 
      filecounter++; 
      sprintf(fileoutputname, "file_part%d", filecounter); 
      ptr_writefile = fopen(fileoutputname, "w"); 
      if (!ptr_writefile) 
       return 1; 
     } 
     fprintf(ptr_writefile,"%s\n", line); 
     linecounter++; 
    } 
    fclose(ptr_readfile); 
    return 0; 
} 
+0

C不關心文件類型。它讀取和寫入二進制文件。 – ForceBru

+0

僅供參考:如果你在Linux/BSD/Cygwin上,已經有一個分割命令可用 –

+0

我注意到你的第一件事對於'char fileoutputname [15];'來說是不必要的。讓它成爲'80'。 –

回答

0

那麼首先文件類型絕對沒有重要性。在C中,你直接用二進制讀取一個文件。 Windows中的所有內容(文件夾除外,我不確定,也可能有一些例外)都是文件,甚至可執行文件。

然後,大小並不是一個真正的問題,如果你逐步閱讀一個「小」緩衝區(就像你在做什麼),這將是沒有問題的。

所以,你可以在每10個緩衝區之後寫一個新文件,直到讀完一個文件。這裏沒有真正的問題或問題。

只是一些細節,你的緩衝區大小應該是4096對大文件的性能。 4096應該是最優化的大小,至少使用read()函數,我不知道fget()。

然後你的文件名大小應該是256。 255是大多數OS上的最大文件名大小(具有空字節的256個)。