如何使用C拆分32 GB或更大的大文件?

时间:2016-11-13 19:35:19

标签: 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;
}

1 个答案:

答案 0 :(得分:0)

首先,文件类型绝对没有重要性。在C中,您可以直接以二进制形式读取文件。 Windows中的所有内容(文件夹除外,我不确定,也可能有一些例外)都是文件,甚至是可执行文件。

然后,如果你用一个&#34;小&#34;一步一步地阅读它,那么这个尺寸确实不是问题。缓冲区(就像你正在做的那样),没有问题。

所以你可以在每10个缓冲区之后写一个新文件,直到你读到的文件结束。这里没有真正的问题或疑问。

只是一些细节,你的缓冲区大小应该是import cherrypy cherrypy.config.update({ 'server.socket_host': '0.0.0.0', 'server.socket_port': 80, }) class WebGUI(object): @cherrypy.expose def index(self): return "<!DOCTYPE html><html><title>Test 001</title><body><h1>Welcome to Test 001</h1></body></html>" @cherrypy.expose def start(self): subprocess.Popen(["nohup", "python", "copyfiles.py"]) return "Files copy started ..." @cherrypy.expose def status(self): .............. .............. if __name__ == '__main__': cherrypy.quickstart(WebGUI()) ,用于大文件的表现。 4096应该是最优化的大小,至少使用read()函数,我不知道fget()。

然后您的文件名大小应为4096。 255是大多数操作系统上的最大文件名大小(256和nullbyte)。