- 论坛徽章:
- 0
|
已知 file1 file2 file3 .... 是已经使用 sort 按行排序的文本文件(约 10 到 100 个,至少 10M 以上),请编写程序合并这些文件。
文件名列表请从 argv 读取,如:
./sort-merge *.txt > result.txt
这里是仿 sort -m 方式排序文件,我这里写了一个非常简单的程序,但是用起来得core dump,麻烦哪个老师指导一下?
并且是当文件特别大的时候就崩溃了,我找不出什么原因, 555~~~
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- int readandwrite(FILE **fp, FILE *op, char line[][8192], char *max, int num, int m);
- int compare_x (FILE **fp, FILE *op, char line[][8192], char *max, int num);
- int main(int argc, char *argv[])
- {
- FILE *fp[argc];
- FILE *op;
- char line[argc][8192];
- int i;
- char *max = NULL;
- if (argc < 2)
- {
- printf("Usage: %s <ARGV>\n", argv[0]);
- exit(EXIT_FAILURE);
- }
- op = fopen("all.txt", "w");
- for (i = 0; i < argc - 1; i ++)
- {
- fp[i] = fopen(argv[i+1], "r");
- }
- compare_x (fp, op, line, max, argc - 1);
- for (i = 0; i < argc - 1; i ++)
- {
- fclose(fp[i]);
- }
- fclose(op);
- return 0;
- }
- int readandwrite(FILE **fp, FILE *op, char line[][8192], char *max, int num, int m)
- {
- int i, j = 0;
- for (i = 0; i < num; i ++)
- {
- if (!max || strcmp(max, line[i]) < 0)
- {
- max = line[i];
- j = i;
- }
- }
- fputs(max, op);
- if (fgets(line[j], 8192, fp[j]) == NULL)
- {
- m ++;
- memset (line[j], '\0', 8192);
- if (m == num) return 0;
- }
- max = NULL;
- readandwrite(fp, op, line, max, num, m);
- return 0;
- }
- int compare_x (FILE **fp, FILE *op, char line[][8192], char *max, int num)
- {
- int i, j = 0, m = 0;
- for (i = 0; i < num; i ++)
- {
- fgets(line[i], 8192, fp[i]);
- if (!max || strcmp(max, line[i]) < 0)
- {
- max = line[i];
- j = i;
- }
- }
- fputs(max, op);
- if (fgets(line[j], 8192, fp[j]) == NULL)
- {
- memset (line[j], '\0', 8192);
- }
- max = NULL;
- readandwrite(fp, op, line, max, num, m);
- return 0;
- }
复制代码 |
|