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