c - 在 C 中将文件拆分为 n 个较小的文件

标签 c

我正在编写一个程序,将一个文件分成 N 个较小的部分 (几乎)大小相等。所以这是我的代码:

FILE * fp = fopen(file,"r");
long aux;
long cursor = 0;
long blockSize = 1024000; //supose each smaller file will have 1 MB

long bytesLimit = blockSize;    

for( i = 0 ; i < n ; i++) {
    FILE * fp_aux = fopen( outputs[i] , "w"); //outputs is an array of temporary file names
    while(cursor < bytesLimit) {    //here occurs the infinite loop
         fscanf(fp,"%lu\n",&aux);
         fprintf(fp_aux,"%lu\n",aux);
         cursor = ftell(fp);
    }
    fclose(fp_aux);
    bytesLimit = bytesLimit + blockSize;
}

//here add some more logic to get the remaining content left in the main file

如果我想将文件分成两部分或三部分,代码可以工作,但是当我尝试将它分成 10 部分时,fscanf 锁定读取相同的数字并保持无限循环那里。

我的输入文件的格式为“%lu\n”,如下所示:

1231231
4341342
4564565
...

最佳答案

如果拆分文件 是重点,那么请简化您的方法。因为您的帖子表明您正在使用文本文件,所以假设它包含带有标点符号、数字、换行等的单词。对于这种类型的内容,可以使用 fgets()/fputs() 将其解析为行。这将允许您从一个大文件中读取行,随时跟踪累积大小,并将行写入多个较小的文件...

一些简单的步骤:

1)确定待分割文件的文件大小
2) 设置所需的小文件大小。
3)打开大文件
4) 在循环中使用 fgets/fputs,打开和关闭文件以拆分内容,使用累积大小作为拆分点。
5) 清理。 (关闭文件等)

下面是一个示例,将说明这些步骤。无论文本内容如何,​​这都会按大小拆分大型文本文件。 (我用了一个130K大小的文本文件,把它分成5k个大小的段

#define SEGMENT 5000 //approximate target size of small file

long file_size(char *name);//function definition below

int main(void)
{
    int segments=0, i, len, accum;
    FILE *fp1, *fp2;
    long sizeFile = file_size(largeFileName);
    segments = sizeFile/SEGMENT + 1;//ensure end of file
    char filename[260]={"c:\\play\\smallFileName_"};//base name for small files.
    char largeFileName[]={"c:\\play\\largeFileName.txt"};//change to your path
    char smallFileName[260];
    char line[1080];

    fp1 = fopen(largeFileName, "r");
    if(fp1)
    {
        for(i=0;i<segments;i++)
        {
            accum = 0;
            sprintf(smallFileName, "%s%d.txt", filename, i);
            fp2 = fopen(smallFileName, "w");
            if(fp2)
            {
                while(fgets(line, 1080, fp1) && accum <= SEGMENT)
                {
                    accum += strlen(line);//track size of growing file
                    fputs(line, fp2);
                }
                fclose(fp2);
            }
        }
        fclose(fp1);
    }
    return 0;
}

long file_size(char *name)
{
    FILE *fp = fopen(name, "rb"); //must be binary read to get bytes

    long size=-1;
    if(fp)
    {
        fseek (fp, 0, SEEK_END);
        size = ftell(fp)+1;
        fclose(fp);
    }
    return size;
}

关于c - 在 C 中将文件拆分为 n 个较小的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30222271/

相关文章:

c - C 中阶乘的素因数分解

c - 用C语言将数据写入文件[序列化]

java - 如何学习用 Java 编写操作系统程序?

c - 多行输入

C - 查找每个单词在输入中出现的次数

C 程序输出错误

c - 使用 int 到 void * 转换避免竞争条件

c - C 中匿名 union 赋值的警告

c - 海湾合作委员会 7.2 : warning: left shift count >= width of type

c - unsigned int * 代替 int