免费注册 查看新帖 |

Chinaunix

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

[C] 求教一下,这段C代码有什么问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-01-09 10:55 |只看该作者 |倒序浏览
已知 file1 file2 file3 .... 是已经使用 sort 按行排序的文本文件(约 10 到 100 个,至少 10M 以上),请编写程序合并这些文件。

文件名列表请从 argv 读取,如:

./sort-merge *.txt > result.txt

这里是仿 sort -m 方式排序文件,我这里写了一个非常简单的程序,但是用起来得core dump,麻烦哪个老师指导一下?
并且是当文件特别大的时候就崩溃了,我找不出什么原因, 555~~~

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>

  4. int readandwrite(FILE **fp, FILE *op, char line[][8192], char *max, int num, int m);
  5. int compare_x (FILE **fp, FILE *op, char line[][8192], char *max, int num);

  6. int main(int argc, char *argv[])
  7. {
  8.         FILE *fp[argc];
  9.         FILE *op;
  10.         char line[argc][8192];
  11.         int i;
  12.         char *max = NULL;
  13.         if (argc < 2)
  14.         {
  15.                 printf("Usage: %s <ARGV>\n", argv[0]);
  16.                 exit(EXIT_FAILURE);
  17.         }
  18.         op = fopen("all.txt", "w");
  19.         for (i = 0; i < argc - 1; i ++)
  20.         {
  21.                 fp[i] = fopen(argv[i+1], "r");
  22.         }
  23.         compare_x (fp, op, line, max, argc - 1);
  24.         for (i = 0; i < argc - 1; i ++)
  25.         {
  26.                 fclose(fp[i]);
  27.         }
  28.         fclose(op);
  29.         return 0;
  30. }

  31. int readandwrite(FILE **fp, FILE *op, char line[][8192], char *max, int num, int m)
  32. {
  33.         int i, j = 0;
  34.         for (i = 0; i < num; i ++)
  35.         {
  36.                 if (!max || strcmp(max, line[i]) < 0)
  37.                 {
  38.                         max = line[i];
  39.                         j = i;
  40.                 }
  41.         }
  42.         fputs(max, op);
  43.         if (fgets(line[j], 8192, fp[j]) == NULL)
  44.         {
  45.                 m ++;
  46.                 memset (line[j], '\0', 8192);
  47.                 if (m == num) return 0;
  48.         }
  49.         max = NULL;
  50.         readandwrite(fp, op, line, max, num, m);
  51.         return 0;
  52. }

  53. int compare_x (FILE **fp, FILE *op, char line[][8192], char *max, int num)
  54. {
  55.         int i, j = 0, m = 0;
  56.         for (i = 0; i < num; i ++)
  57.         {
  58.                 fgets(line[i], 8192, fp[i]);
  59.                 if (!max || strcmp(max, line[i]) < 0)
  60.                 {
  61.                         max = line[i];
  62.                         j = i;
  63.                 }
  64.         }
  65.         fputs(max, op);
  66.         if (fgets(line[j], 8192, fp[j]) == NULL)
  67.         {
  68.                 memset (line[j], '\0', 8192);
  69.         }
  70.         max = NULL;
  71.         readandwrite(fp, op, line, max, num, m);
  72.         return 0;
  73. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2008-01-09 16:37 |只看该作者
你一下子打开那么多的文件,恐怕不是很好吧,应该尽量操作完一个就关掉,然后再开一个,文件的句柄应该是有限的

论坛徽章:
0
3 [报告]
发表于 2008-01-09 20:39 |只看该作者
文件的句柄? 同志你还没有搞清楚是什么东西吧?

另外,解释性语言的句柄也不是有限的吧? 谢谢你的回答,但是你的回答也太离谱,你还是多看看书本吧。

有老师帮忙解决么?我想知道什么原因导致错误的?

[ 本帖最后由 lsof 于 2008-1-9 20:40 编辑 ]

论坛徽章:
1
双子座
日期:2013-08-19 14:56:16
4 [报告]
发表于 2008-01-09 21:02 |只看该作者
这程序写的 很好很强大

论坛徽章:
3
天蝎座
日期:2014-10-25 13:44:312015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:48:31
5 [报告]
发表于 2008-01-09 21:57 |只看该作者
基本上没看懂,但是:
        FILE *fp[argc];
        FILE *op;
        char line[argc][8192];
数组可不可以用 fp[argc]的方式来定义?

论坛徽章:
0
6 [报告]
发表于 2008-01-09 22:12 |只看该作者
好像加const 就可以!

论坛徽章:
0
7 [报告]
发表于 2008-01-09 22:25 |只看该作者
原帖由 francybright 于 2008-1-9 22:12 发表
好像加const 就可以!


什么意思?

论坛徽章:
0
8 [报告]
发表于 2008-01-09 22:31 |只看该作者
原帖由 ilex 于 2008-1-9 21:57 发表
基本上没看懂,但是:
        FILE *fp[argc];
        FILE *op;
        char line[argc][8192];
数组可不可以用 fp[argc]的方式来定义?


你说的文件指针fp不能用数组?
指针是指内存里的一个地址,肯定可以啊

论坛徽章:
0
9 [报告]
发表于 2008-01-09 22:53 |只看该作者
原帖由 lsof 于 2008-1-9 10:55 发表
已知 file1 file2 file3 .... 是已经使用 sort 按行排序的文本文件(约 10 到 100 个,至少 10M 以上),请编写程序合并这些文件。

文件名列表请从 argv 读取,如:

./sort-merge *.txt > result.txt

...

看似这个程序问题比较多, 都有可能是异常的原因:
1. 如果楼主不是为了发贴而刻意改过的话, 我认为是不可能通过编译的,因为C语言里面,局部变量是不支持动态数组的,因此以下的两个局部动态数组的定义是不允许的:
        FILE *fp[argc];
        char line[argc][8192];

       要实现动态数组,在C语言里用的是malloc函数实现,在C++里则是用new操作符实现的.

2. 程序中使用 char line[argc][8192] 的方式来定义数组, 排除语法上的错误,假设语法通过了. 但这种定义, 是在栈上分配内存的, 而大部分平台上的栈空间只有64K, 可以想象,一个数组就占用了大部分的栈空间,而且程序中使用了递归算法, 也是非常耗栈内存的, 因此很容易因为产生栈溢出的异常.

3. if (!max || strcmp(max, line) < 0) , 某些编译器可能会在!max (即max==NULL)的情况下,仍然执行strcmp(max, line) , 这种情况下,CORE DUMP就有可能了.

当然,最好的出错原因定位, 就是使用调试工具, 例如gdb.

论坛徽章:
1
双子座
日期:2013-08-19 14:56:16
10 [报告]
发表于 2008-01-09 23:19 |只看该作者
fputs(max, op);  这句出错的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP