免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1513 | 回复: 4
打印 上一主题 下一主题

[C] 分割文件, 计算总行数不对 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-12-03 11:04 |只看该作者 |倒序浏览

  1. #include <fcntl.h>
  2. #include <unistd.h>
  3. #include <sys/stat.h>
  4. #include <stdlib.h>
  5. #include <stdio.h>
  6. #include <string.h>

  7. #define SIZE 4096
  8. #define dbg(...) fprintf(stderr,__VA_ARGS__)
  9. typedef struct{
  10.         unsigned long offset;
  11.         unsigned long size;
  12. } PART;

  13. char filein[24];   
  14. char fileout1[24];
  15. char fileout2[24];
  16. char fileout3[24];


  17. int main(int argc, char *argv[]){
  18.         char                   data[SIZE];
  19.         struct stat   f_stat;
  20.         int fin, fout1, fout2, fout3, sz, i=0;
  21.         PART         part1, part2, part3;

  22.         if(argc != 5){
  23.                 puts("Not enough arguments.");
  24.                 puts("a.out in o1 o2 o3");
  25.                 return -1;
  26.         }
  27.         strcpy(filein, argv[1]);
  28.         strcpy(fileout1, argv[2]);
  29.         strcpy(fileout2, argv[3]);
  30.         strcpy(fileout3, argv[4]);

  31.         stat(filein, &f_stat);         // getting the info of file
  32.         printf("Size of file is %lu \n", f_stat.st_size);

  33.         // breaking the size of file in 3 parts
  34.         part1.offset = 0;
  35.         part1.size = f_stat.st_size / 3;

  36.         part2.offset = part1.size;
  37.         part2.size = part1.size;

  38.         part3.offset = part2.offset + part2.size;
  39.         part3.size = f_stat.st_size - part3.offset;

  40.         fin = open(filein, O_RDONLY);
  41.         fout1 = open(fileout1, O_WRONLY|O_CREAT, 0666);
  42.         fout2 = open(fileout2, O_WRONLY|O_CREAT, 0666);
  43.         fout3 = open(fileout3, O_WRONLY|O_CREAT, 0666);

  44.         lseek(fin,part1.offset, SEEK_SET);
  45.         while(i < part1.size){
  46.                 sz = read(fin, data, SIZE);
  47.                 if(write(fout1, data, sz) <0)
  48.                      exit(1);
  49.                 i += sz;
  50.         }
  51.         close(fout1);
  52.         printf("f1 \n");

  53.    i=0;
  54.    lseek(fin,part2.offset, SEEK_SET);
  55.    while(i < part2.size){
  56.                 sz = read(fin, data, SIZE);
  57.                 if(write(fout2, data, sz)<0)
  58.                      exit(2);
  59.                 i += sz;
  60.    }
  61.    close(fout2);
  62.    printf("f2 \n");

  63.    i=0;
  64.    lseek(fin,part3.offset, SEEK_SET);
  65.    while(i < part3.size){
  66.                 sz = read(fin, data, SIZE);
  67.                 if(write(fout3, data, sz) <0)
  68.                      exit(3);
  69.                 i += sz;
  70.    }
  71.    printf("f3 \n");
  72.    close(fout3);

  73.    close(fin);
  74.    printf("file breaking done\n");
  75.    fflush(stdout);
  76.    return 0;
  77. }
复制代码
我用 seq 10000000 > test.dat ( 在 Linux ) 作为 input 文件.
打入 $> a.out test.dat f1 f2 f3
$> wc -l f1 f2 f3
3425928 f1
3287040 f2
3287038 f3
10000006 total

$> wc -l test.dat
10000000 test.dat

为何分割后三个文件总行数大于单个文件总行数 ? 我错在哪里 ? 多谢 !!!

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
2 [报告]
发表于 2014-12-03 11:22 |只看该作者
每行不等宽,怎么能直接 /3

论坛徽章:
0
3 [报告]
发表于 2014-12-03 11:39 |只看该作者
那怎样做才对呢 ? 谢谢 !

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
4 [报告]
发表于 2014-12-03 11:48 |只看该作者
mjus 发表于 2014-12-03 11:39
那怎样做才对呢 ? 谢谢 !


若你的需求是按行均分,那你只能先计算总行数,再根据行数分割(逐行读或者自行判断换行符)

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
5 [报告]
发表于 2014-12-03 14:30 |只看该作者
  1. #include <stdio.h>

  2. #define MAX_LINE 32

  3. int nstr_lmt(const char *s, int lmt)
  4. {
  5.         int off;

  6.         for (off = 0; off < lmt && s[off] != '\0'; ++off) {
  7.         }
  8.         return off;
  9. }

  10. int read_line(char *buf, int buf_len, FILE *fp)
  11. {
  12.         if (fgets(buf, buf_len, fp) == NULL) {
  13.                 return 0;
  14.         }
  15.         return nstr_lmt(buf, buf_len);
  16. }

  17. int main(void)
  18. {
  19.         char line_buf[MAX_LINE];
  20.         FILE *fp;
  21.         int line_count;
  22.         int line_start;
  23.         int line_end;
  24.         int line_len;

  25.         printf("Please Input Filename: ");
  26.         fgets(line_buf, MAX_LINE, stdin);
  27.         line_len = nstr_lmt(line_buf, MAX_LINE);
  28.         if (line_len > 0 && line_buf[line_len - 1] == '\n') {
  29.                 line_buf[line_len - 1] = '\0';
  30.         }
  31.         printf("Please Input Start Line: ");
  32.         scanf("%d", &line_start);
  33.         printf("Please Input End Line: ");
  34.         scanf("%d", &line_end);
  35.         fp = fopen(line_buf, "r");
  36.         if (fp != NULL) {
  37.                 line_count = 1;
  38.                 while ((line_len = read_line(line_buf, MAX_LINE, fp)) > 0) {
  39.                         if (line_buf[line_len - 1] == '\n') {
  40.                                 if (line_count >= line_start && line_count <= line_end) {
  41.                                         printf("%d %.*s", line_count, line_len, line_buf);
  42.                                 }
  43.                         }else {
  44.                                 if (line_count >= line_start && line_count <= line_end) {
  45.                                         printf("%d ", line_count);
  46.                                 }
  47.                                 do {
  48.                                         if (line_count >= line_start && line_count <= line_end) {
  49.                                                 printf("%.*s", line_len, line_buf);
  50.                                         }
  51.                                 }while ((line_len = read_line(line_buf, MAX_LINE, fp)) > 0 && line_buf[line_len - 1] != '\n');
  52.                                 if (line_count >= line_start && line_count <= line_end) {
  53.                                         printf("%.*s", line_len, line_buf);
  54.                                 }
  55.                         }
  56.                         ++line_count;
  57.                 }
  58.                 printf("Total Lines: %d\n", line_count);
  59.                 fclose(fp);
  60.                 return 0;
  61.         }
  62.         return -1;
  63. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP