标题:关于拆分文件的 问题入内
只看楼主
wp231957
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:神界
等 级:版主
威 望:422
帖 子:13681
专家分:53296
注 册:2012-10-18
结帖率:99.76%
已结贴  问题点数:100 回复次数:10 
关于拆分文件的 问题入内
看下面有个网友提出的问题
把一个大的文本文件分割成若干个小文件 最后一个文件为剩余字节 前几个文件大小都一致
 自己写了一个  貌似思路比较清晰  实际和设想差距挺大的


程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char* argv[])
//w21 w21.log 1000 wp  cmd模式下测试此代码  
//    其中  w21为自己编译的exe名 w21.log为待分割的文件名
//          1000为分割长度 wp为分割后的小文件名的前缀
{
    char buf[100]={'\0'};
    char t[100]={'\0'};
    FILE * infile;
    FILE * outfile;
    if((infile=fopen(argv[1],"r"))==NULL) 
    {
        printf("无法打开此文件\n");
        return 0 ; 
    }
    int i=0;
    char ch;
    int cout=0;
    while(1)
    {
        itoa(i,t,10);
        strcat(buf,argv[3]);
        strcat(buf,t);
        strcat(buf,".txt");   //以上几行代码用于连接输出自增型文件名
        outfile=fopen(buf,"w") ;
        while(!feof(infile))
        {
            ch=fgetc(infile);
            fputc(ch,outfile);
            ++cout;
            if(cout>=atoi(argv[2]))
            {
                fclose(outfile);
                break;
            }
        }
        printf("cout==%d  argv[2]==%d  \n",cout,atoi(argv[2]));  //调试用
        if(feof(infile)) break;
        memset(buf,'\0',100);
        i++;
        cout=0;
    }
    fclose(infile);
    char tmp[100]={'\0'};  //以下代码调试用
    strcat(tmp,"dir ");
    strcat(tmp,argv[1]);
    system(tmp);
    system("dir wp*.*");
    return 0;
}

/*
D:\c_source\w16\w21\Debug>w21 w21.log 1000 wp
cout==1000  argv[2]==1000
cout==1000  argv[2]==1000
cout==1000  argv[2]==1000
cout==1000  argv[2]==1000
cout==1000  argv[2]==1000
cout==549  argv[2]==1000

 驱动器 D 中的卷是 wanping-D

 卷的序列号是 98D7-D39A


 D:\c_source\w16\w21\Debug 的目录

2017-06-08  10:05             5,598 w21.log
               1 个文件          5,598 字节
               0 个目录 27,092,017,152 可用字节

 驱动器 D 中的卷是 wanping-D

 卷的序列号是 98D7-D39A


 D:\c_source\w16\w21\Debug 的目录

2017-06-08  10:05             1,011 wp0.txt
2017-06-08  10:05             1,006 wp1.txt
2017-06-08  10:05             1,006 wp2.txt
2017-06-08  10:05             1,007 wp3.txt
2017-06-08  10:05             1,008 wp4.txt
2017-06-08  10:05                 0 wp5.txt
               6 个文件          5,038 字节
               0 个目录 27,092,017,152 可用字节
*/

/*
这里出现了几个问题
1、分割后小文件 并不是理想中的长度为1000每个 
2、出现了3个各不相同的文件大小  理论应该全部相等的 分别是 5594  5038  5549
*/



[此贴子已经被作者于2017-6-8 10:12编辑过]

搜索更多相关主题的帖子: 文本文件 
2017-06-08 10:08
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:100 
试试用 "rb" & "wb"
2017-06-08 10:12
wp231957
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:神界
等 级:版主
威 望:422
帖 子:13681
专家分:53296
注 册:2012-10-18
得分:0 
回复 2楼 吹水佬
嗯 使用rb wb 之后  分割后文件 多了一个字节  大概是EOF吧

DO IT YOURSELF !
2017-06-08 10:16
wp231957
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:神界
等 级:版主
威 望:422
帖 子:13681
专家分:53296
注 册:2012-10-18
得分:0 
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char* argv[])
//w21 w21.log 1000 wp  cmd模式下测试此代码  
//    其中  w21为自己编译的exe名 w21.log为待分割的文件名
//          1000为分割长度 wp为分割后的小文件名的初始字符串
{
    char buf[100]={'\0'};
    char t[100]={'\0'};
    FILE * infile;
    FILE * outfile;
    if((infile=fopen(argv[1],"rb"))==NULL) 
    {
        printf("无法打开此文件\n");
        return 0 ; 
    }
    int i=0;
    char ch;
    int cout=0;
    while(1)
    {
        itoa(i,t,10);
        strcat(buf,argv[3]);
        strcat(buf,t);
        strcat(buf,".txt");   //以上几行代码用于连接输出自增型文件名
        outfile=fopen(buf,"wb") ;
        while(!feof(infile))
        {
            ch=fgetc(infile);
            if(!feof(infile)) fputc(ch,outfile);
            ++cout;
            if(cout>=atoi(argv[2]))
            {
                fclose(outfile);
                break;
            }
        }
        if(feof(infile)) break;
        memset(buf,'\0',100);
        i++;
        cout=0;
    }
    fclose(infile);
    return 0;
}




这样貌似就没有问题 了   谢谢吹水佬

DO IT YOURSELF !
2017-06-08 10:20
wp231957
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:神界
等 级:版主
威 望:422
帖 子:13681
专家分:53296
注 册:2012-10-18
得分:0 
回复 2楼 吹水佬
能解释一下  r  w  会失败
           rb wb  会成功  吗 why?

DO IT YOURSELF !
2017-06-08 10:21
wp231957
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:神界
等 级:版主
威 望:422
帖 子:13681
专家分:53296
注 册:2012-10-18
得分:0 
看测试效果

程序代码:
 D:\c_source\w16\w21\Debug 的目录

2017-06-08  10:23             1,000 wp0.txt
2017-06-08  10:23             1,000 wp1.txt
2017-06-08  10:23             1,000 wp2.txt
2017-06-08  10:23             1,000 wp3.txt
2017-06-08  10:23               916 wp4.txt
               5 个文件          4,916 字节
               0 个目录 27,092,025,344 可用字节

D:\c_source\w16\w21\Debug>dir w21.log

 驱动器 D 中的卷是 wanping-D

 卷的序列号是 98D7-D39A


 D:\c_source\w16\w21\Debug 的目录

2017-06-08  10:18             4,916 w21.log
               1 个文件          4,916 字节

DO IT YOURSELF !
2017-06-08 10:24
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
以下是引用wp231957在2017-6-8 10:21:40的发言:

能解释一下  r  w  会失败
           rb wb  会成功  吗 why?

这样比较看看有什么不同:

#include <stdio.h>

void fun(const char *mode)
{
    char buf[10];
    FILE *fp = fopen("test.dat", mode);
    fread(buf, 10, 1, fp);
    fclose(fp);
    printf("\"%s\" mode:\n", mode);
    int i;
    for (i=0; i<10; ++i)
        printf("0x%02X ", buf[i]);
    printf("\n");
}

main()
{
    char buf[10] = {0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A};
    FILE *fp = fopen("test.dat", "w");
    fwrite(buf, 10, 1, fp);
    fclose(fp);
    fun("r");
    fun("rb");
}
2017-06-08 11:34
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
再将这句:
FILE *fp = fopen("test.dat", "w");
改为:
FILE *fp = fopen("test.dat", "wb");
结果:
2017-06-08 11:38
wp231957
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:神界
等 级:版主
威 望:422
帖 子:13681
专家分:53296
注 册:2012-10-18
得分:0 
二进制模式下 回车是回车 换行是换行 2个站位
文本模式下   大概回车+换行是一个站位吧

还有其他区别吗  神马中文 西文啥的  我在网上看到FPUTC  支持中文  是这个函数支持中文 还是打开文件的模式支持中文  还是操作系统支持中文

DO IT YOURSELF !
2017-06-08 20:58
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
以下是引用wp231957在2017-6-8 20:58:08的发言:

二进制模式下 回车是回车 换行是换行 2个站位
文本模式下   大概回车+换行是一个站位吧

还有其他区别吗  神马中文 西文啥的  我在网上看到FPUTC  支持中文  是这个函数支持中文 还是打开文件的模式支持中文  还是操作系统支持中文

最多也就256个码,真有兴趣就试试。
2017-06-09 05:31



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-477741-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.195482 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved