合并多个文本文件到一个分隔变量宽度文件

编程练习总是令人兴奋,尤其是当它能让重新使用那些生疏的编程技能时。因此,编写了这样一个函数,它接受一个包含任意数量文件名的数组。这个函数不会在打开文件失败时失败,而是报告文件打开错误,并将不可读的文件视为空。它接受一系列字符作为列分隔符。一个参数指定是否包含一个包含文件名的"标题行"。它不需要输入文件具有相同数量的行——当输入文件数据耗尽时,将向输出写入"空"值。返回值是写入输出的总行数。还在考虑添加一个功能,即如果指定,可以在值周围添加引号。另一个潜在的功能是过滤掉空行。

使用代码

C语言示例:

result = MergeFiles(argc - 2, argv[1], argv[2], "\t", false);

结果可能如下:

f:\>FileMerge CON A.txt B.txt C.txt A.txt B.txt C.txt AAAAA BBBBB CCCCC AAAAA BBBBB AAAAA CCCCC AAAAA BBBBB AAAAA BBBBB CCCCC BBBBB CCCCC CCCCC CCCCC f:\>

MergeFiles函数

以下是函数的实现:

int MergeFiles( int Count, char *Dest, char *Source[], char *Delimiter, bool Headers ) { int result = 0; FILE* dst; if ((dst = fopen(Dest, "w")) == NULL) { printf("\nError opening %s %d", Dest, errno); result = 0 - errno; } else { int i; int j = 0; FILE** src = (FILE**)calloc(Count, sizeof(FILE*)); if (Delimiter == NULL) { Delimiter = ""; } for (i = 0; i < Count; i++) { if (Headers) { if (i > 0) { fprintf(dst, "%s", Delimiter); } fprintf(dst, "%s", Source[i]); } if ((src[i] = fopen(Source[i], "r")) == NULL) { printf("\nError opening %s %d", Source[i], errno); } else { j++; } } if (Headers) { fputc('\n', dst); result++; } while (j > 0) { for (i = 0; i < Count; i++) { if (i > 0) { fprintf(dst, "%s", Delimiter); } if (src[i] != NULL) { while (1) { int c = getc(src[i]); if (c == '\n') { break; } else if (c == EOF) { fclose(src[i]); src[i] = NULL; j--; break; } else { fputc(c, dst); } } } } fputc('\n', dst); result++; } free(src); fclose(dst); } return result; }

手头唯一的支持bool的C编译器是:

gcc version 3.2 (mingw special 20020817-1)
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485