C语言学习笔记之文件的分割与合并
2016-07-06 14:54
1246 查看
分割与合并的思想
1. 分割:和安卓多线程下载类似 ,首先将文件长度按N段分,然后将每段文件读取并写入到相应的临时文件,以达到分割的目的 2. 合并:将每段临时文件依次读取,然后写入到要合并成的新文件
注意细节
1. 文件打开后记得要关闭 2. 对文件打开的状态进行判断,处理异常 3. fgets函数会获取行尾的\n,必要时进行相关处理,fputs输入字符串时不会自动添加\n 4. 对最后一块的长度进行特殊处理,因为它不一定等于每一块的长度 5. 对操作的分割合并的文件使用二进制的模式进行打开 6. 注意feof函数的使用,在文件指针指向EOF时,下一次读取feof才会返回1
源代码
分割文件
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h> #define N 6 // 定义分割块数 void mainx() { FILE *fsrc = fopen("D:\\yu\\1.wmv", "rb"); // 源文件 FILE *div = fopen("D:\\yu\\div.txt","w"); // 存入分割条目的信息 if (fsrc == NULL || div == NULL) { perror("打开错误:"); return; } fseek(fsrc, 0, SEEK_END); int fLen = ftell(fsrc); // 文件长度 //printf("文件长度:%d\n", fLen); int blockLen = fLen / N; // 每一块的长度 //printf("blockLen:%d\n", blockLen); FILE *ftmp; // 临时文件, for (int i = 0; i < N; i++) // 按块分割 { char tName[20]; char tdir[60] = "D:\\yu\\"; sprintf(tName, "部分%d.tmp", i+1);//生成文件名 strcat(tdir, tName); //产生临时目录 //printf("%s\n", tdir); ftmp = fopen(tdir, "wb"); // 生成临时文件 if (ftmp == NULL) { perror("产生文件出错:"); break; } fputs(tdir, div); // 写入文件名 fputc('\n',div); int offset = i*blockLen; //计算偏移量 fseek(fsrc, offset, SEEK_SET); int count = 0; //统计写入ftmp的数量 if (i == N - 1) blockLen = fLen - blockLen*(N - 1); //最后一块的长度 while (count<blockLen && !feof(fsrc)) { fputc(fgetc(fsrc),ftmp); count++; } printf("count:%d\n", count); fclose(ftmp); } fclose(fsrc); fclose(div); system("pause"); }
合并文件
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h> void main() { FILE *fdest = fopen("D:\\yu\\1_new.wmv", "wb"); //合并生成的文件 FILE *div = fopen("D:\\yu\\div.txt", "r"); // 读取已分割部分的目录 if ( fdest == NULL || div == NULL) { perror("打开文件出错"); return; } char tempName[60]; FILE *tempFile; // 循环读出temp文件路径,并进行文件的合并 while (fgets(tempName, 60, div)) // fgets读取到字符串时返回非0,否则返回0 { tempName[strlen(tempName)-1] = '\0'; // 去掉最后一个\n tempFile = fopen(tempName, "rb"); if (tempFile == NULL) { printf("打开文件%s失败,", tempName); perror("出错原因"); return; } // feof判断文件结尾 // 当文件内部的位置指针指向文件结束时,并不会立即设置FILE结构中的文件结束标识, // 只有再执行一次读文件操作,才会设置结束标志,此后调用feof()才会返回为真。 // 问题代码 //while (!feof(tempFile)) // 问题代码,每次合并多写入一个EOF(-1) //{ // fputc(fgetc(tempFile), fdest); // 将部分文件写入合并的文件 //} printf("正在合并%s到新文件\n",tempName); // 修正后的代码 int ch = fgetc(tempFile);//在用feof前先读取一个字符 while (!feof(tempFile))//判断你上面读取的ch是否为结束符,feof在EOF的下一次读取才会返回1,即若ch为EOF,则while循环不会进入,而当ch为EOF的前一次读取时,while循环仍会继续。 { fputc(ch, fdest); //写入字符 ch = fgetc(tempFile);//读取下一个字符 如果是EOF,那么进入下一次循环前就会停止 } fclose(tempFile); } fclose(fdest); fclose(div); system("pause"); }
效果图
相关文章推荐
- 【干货】国外程序员整理的 C++ 资源大全
- c++之复数类运算
- C语言学习笔记(二)
- leetcode_c++:哈希: Copy List with Random Pointer(138)
- c++——复制构造函数的使用
- usage of list and iterator
- C++中的friend class
- FatMouse' Trade hdu1009
- VS2012C++学习笔记2(第3-6章)
- usage of map
- 将32位C++内嵌汇编迁移到64位
- C/C++ 预编译命令
- 详解c++中类的六个默认的成员函数
- SetupDLL.cpp 错误
- c++——this指针
- c++——成员初始化列表
- c++ dll创建及使用 rundll32 测试
- 封装libsvm成可程序调用的C/C++类
- C++ 继承
- C++函数系列篇:函数的默认值+带默认参数的函数