用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - c++代码库

c++拆分文件

2013-03-12 作者: 小蜜锋举报

[c++]代码库

/*
* 把一个大文件文件拆分成指定的大小的几个小文件
* Author: Daniel Chen
* yihua.chen@hotmail.com
*/

#include <stdlib.h>
#include <stdio.h>

#define MAXFILECNT	8
static int filecount = 0;
static char *Files[MAXFILECNT];

static char txtBuff[1024 * 520];
static char fname[256];
static int flength = 512;

int getContent(FILE *file, char *buff, int offset, int length, int *flag) {
    char *tmp = &buff[offset];
    int c = 0;
    int i = 0;

    *flag = 0;

    while ((c = fgetc(file)) > 0 && i < length) {
        tmp[i++] = (char)c;
    }

    while (c > 0 && c != '\n') {
        tmp[i++] = (char)c;
        c = fgetc(file);
    }

    if (c <= 0) {
        fclose(file);
        *flag = 1;
    }

    tmp[i] = '\0';
    return (i + offset);
}


void divide(char **files, int filecnt, const char *filename, const char *type, int divLen) {
    int i = 0;
    int j = 0;
    int len = 0;
    int flag = 0;
    int offset = 0;
    FILE *sf, *tf;

    if (filecnt <= 0)
        return;

    sf = NULL;
    while (1) {
        if (sf == NULL)
            sf = fopen(files[i], "r");

        if (sf == NULL) {
            printf("Error: Open file %s failed!\n", files[i]);
            exit(1);
        }

        len = getContent(sf, txtBuff, offset, divLen - offset, &flag);

        if (flag) {	/* 当前文件已经读完 */
            if (i >= filecnt - 1) {	/* 没有新的文件可读取 */
                sprintf(fname, "%s_%03d.%s", filename, j++, type);
                tf = fopen(fname, "w+");
                if (tf == NULL) {
                    printf("Create and open file %s failed!\n", fname);
                    exit(1);
                }

                fputs(txtBuff, tf);
                fflush(tf);
                fclose(tf);

                return;		/* 函数退出 */
            } else {		/* 还有新的文件可读取 */
                if (len >= divLen) {	/* 本次读取已经完成 */
                    sprintf(fname, "%s_%03d.%s", filename, j++, type);
                    tf = fopen(fname, "w+");
                    if (tf == NULL) {
                        printf("Create and open file %s failed!\n", fname);
                        exit(1);
                    }

                    fputs(txtBuff, tf);
                    fflush(tf);
                    fclose(tf);

                    i++;
                    offset = 0;
                    sf = NULL;
                    continue;		/* 继续读取下一个文件 */
                } else {		/* 本次读取尚未完成 */
                    i++;
                    sf = NULL;	/* 读取下一个文件 */
                    continue;
                }
            }
        } else {			/* 当前文件还没有读取完成 */
            if (len < divLen) {	/* 如果读取的长度不够,则出错 */
                printf("Error: Read file %s error!\n", files[i]);
                exit(1);
            }

            /* 将本次读取的内容写入新的文件 */
            sprintf(fname, "%s_%03d.%s", filename, j++, type);
            tf = fopen(fname, "w+");
            if (tf == NULL) {
                printf("Create and open file %s failed!\n", fname);
                exit(1);
            }

            fputs(txtBuff, tf);
            fflush(tf);
            fclose(tf);

            /* 继续读取下一部分内容 */
            offset = 0;
            continue;
        }

    }

    return;
}


int main(int argc, char **argv) {
    int i;

    if (argc <= 4) {
        printf("Usage: %s target_file_name target_file_type divide_len file1 [file2 ...]\n", argv[0]);
        system("pause");
        return EXIT_SUCCESS;
    }

    filecount = argc - 4;

    if (filecount > MAXFILECNT) {
        printf("Open too many files!\n");
        return EXIT_FAILURE;
    }

    flength = atoi(argv[3]) * 1024;

    for (i = 0; i < filecount; i++)
        Files[i] = argv[4 + i];

    divide(Files, filecount, argv[1], argv[2], flength);

    return EXIT_SUCCESS;
}




网友评论    (发表评论)


发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

输入口令后可复制整站源码

加载中,请稍后...