2016-11-13 61 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个)。