当前位置:   article > 正文

C语言学习笔记之文件的分割与合并_c语言注释块分割

c语言注释块分割

分割与合并的思想

1. 分割:和安卓多线程下载类似 ,首先将文件长度按N段分,然后将每段文件读取并写入到相应的临时文件,以达到分割的目的
2. 合并:将每段临时文件依次读取,然后写入到要合并成的新文件
  • 1
  • 2

注意细节

 1. 文件打开后记得要关闭
 2. 对文件打开的状态进行判断,处理异常
 3. fgets函数会获取行尾的\n,必要时进行相关处理,fputs输入字符串时不会自动添加\n
 4. 对最后一块的长度进行特殊处理,因为它不一定等于每一块的长度
 5. 对操作的分割合并的文件使用二进制的模式进行打开
 6. 注意feof函数的使用,在文件指针指向EOF时,下一次读取feof才会返回1
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

源代码

分割文件
#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");
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
合并文件
#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前先读取一个字符

         //判断你上面读取的ch是否为结束符,feof在读取到EOF才会返回1,
         //即若ch为EOF,则while循环不会进入,而当ch为EOF的前一次读取时,while循环仍会继续。
         while (!feof(tempFile))
         {
             fputc(ch, fdest); //写入字符
             ch = fgetc(tempFile);//读取下一个字符 如果是EOF,那么进入下一次循环前就会停止
         }

         fclose(tempFile);
    }
    fclose(fdest);
    fclose(div);

    system("pause");
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58

效果图
这里写图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/49734
推荐阅读
相关标签
  

闽ICP备14008679号