首页 > 代码库 > c语言文件分割与合并

c语言文件分割与合并

一.综述

c语言操作文件通过文件指针FILE*,每个要操作的文件必须打开然后才能读写。

注意事项:

@1分割与合并文件最好使用二进制模式即"rb"或"wb",这样可以操作任何类型文件

@2FILE 指针一定要进行判空操作即看F == NULL成立不

@3文件用完必须关闭,释放系统资源,因为文件会分配缓冲区,占据内存

1.包含头文件

_CRT_SECURE_NO_WARNINGS表示关闭安全检查
1 #define _CRT_SECURE_NO_WARNINGS
2 #include<stdio.h>
3 #include<stdlib.h>
4 #include<string.h>

2.编写分割函数

 1 /*文件分割,path为要分割的文件路径name为文件名,count为分割数量,savepath为保存路径,返回-1表示分割失败,0表示成功*/
 2 int splitFile(char *path, int count, char *savepath, char *savename)
 3 {
 4     FILE *F = fopen(path,"rb");
 5     if (F == NULL)
 6     {
 7         return  -1;
 8     }
 9     else
10     {
11         fseek(F, 0, SEEK_END);//将文件指针移动到文件末尾
12         int length = ftell(F);//计算文件指针到文件开头的字节数,即就是文件大小
13         int yushu = length % count;//余数
14         int size = length / count; //前面count-1份每一分大小为size,最后一份为size + yushu
15         for (int i = 1; i <= count; i++)
16         {
17             char savefile[100];
18             sprintf(savefile, "%s%d%s", savepath, i, savename);
19             printf("%s", savefile);
20             FILE *P = fopen(savefile, "wb");
21             if (P == NULL)
22             {
23                 fclose(F);
24                 return -1;
25             }
26             else
27             {
28                 fseek(F, (i - 1)*size, SEEK_SET);
29                 if (i == count)
30                 {
31                     for (int j = 0; j <= size + yushu; j++)
32                     {
33                         int c = fgetc(F);
34                         fputc(c, P);
35                     }
36                 }
37                 else
38                 {
39                     for (int j = 0; j < size; j++)
40                     {
41                         int c = fgetc(F);
42                         fputc(c, P);
43                     }
44                 }
45 
46 
47             }
48             fclose(P);
49         }
50         fclose(F);
51         return 0;
52     }

3.编写合并函数

 1 /*合并文件,将文件list中每一行指定的文件按行顺序合并为一个大文件bigfile返回-1表示分割失败,0表示成功*/
 2 int mergeFile(char *list,int count,char *bigfile)
 3 {
 4     FILE *F = fopen(list, "r");
 5     FILE *BF = fopen(bigfile, "wb");
 6     if (F == NULL || BF == NULL)
 7     {
 8         printf("打开文件失败");
 9         return -1;
10     }
11     else
12     {
13         
14         for (int i = 0; i < count; i++)
15         {
16             char str[200];
17             fgets(str, 200, F);//每次读取一行字符串,读到末尾为0
18             printf("%s", str);
19             int len = strlen(str);
20             str[len - 1] = \0;
21             printf("%s", str);
22             FILE *P = fopen(str, "rb");
23             if (P == NULL)
24             {
25                 printf("打开文件失败");
26                 fclose(F);
27                 fclose(BF);
28                 return -1;
29             }
30             else
31             {
32                 int c = fgetc(P);
33                 while (c != EOF)
34                 {
35                     
36                     fputc(c, BF);
37                     c = fgetc(P);
38                 }
39             }
40             fclose(P);
41 
42 
43         }
44 
45 
46 
47     }
48     fclose(F);
49     fclose(BF);
50     return 0;
51 }

4.主函数测试编写的函数

1 void main()
2 {
3     int i = splitFile("F:\\文件分割与合并.mp4", 4, "F:\\", "文件分割与合并.mp4");
4     printf("%d", i);
5     mergeFile("F:\\list.txt",4, "F:\\he.mp4");
6     system("pause");
7 }

5.测试结果截图

分割结果:产生四个mp4文件,从1文件分割与合并.mp4到4文件分割与合并.mp4

技术分享

合并结果:

技术分享

list文件内容:

技术分享

 

c语言文件分割与合并