【发布时间】:2014-05-17 06:21:57
【问题描述】:
编写一个程序,从 命令行:week09_1 file1.txt file2.txt file3.txt
您的程序应打开文件 file1.txt 和 file2.txt 以供读取和创建
文件file3.txt如下:
file3.txt的第一行是file1.txt的第一行
file3.txt 的第二行是 file2.txt 的第一行
file3.txt的第三行是file1.txt的第二行
file3.txt的第四行就是file2.txt的第二行
...
当一个输入文件到达 EOF 时,另一个文件中的剩余行
应该被复制到输出文件并且程序终止。你的
如果文件名少于 3 个,程序应打印相应的错误消息
在命令行上提供,或者如果文件无法打开。
所以到目前为止,我已经能够做提示要求我做的事情;但是,当一个文件用完打印行然后它只从另一个文件打印时打印在同一行,我想知道当它只从一个文件打印时如何让它开始一个新行。
我也不明白我应该如何按照提示询问的方式在命令行参数中实现。
#include <stdio.h>
char line1[256] = { };
char line2[256] = { };
char check;
int END = 0, END1 = 0, END2 = 0;
int main(int argc, char *argv[]) {
if (argc != 4) {
printf("Error: Wrong amount of arguments\n");
return 0;
}
FILE *file1 = fopen("argv[1]", "r");
FILE *file2 = fopen("argv[2]", "r");
FILE *file3 = fopen("argv[3]", "w");
if (argv == NULL) {
printf("Error: file could not be opened.\n");
return 0;
}
while (END != 2) {
check = fgets(line1, 256, file1);
if (check != NULL) {
fprintf(file3, "%s", line1);
} else if (check == NULL) {
END1 = 1;
}
check = fgets(line2, 256, file2);
if (check != NULL) {
fprintf(file3, "%s", line2);
} else if (check == NULL) {
END2 = 1;
}
END = END1 + END2;
}
return 0;
}
【问题讨论】:
-
请注意行可能会很长。
-
在缩进代码时:删除幻数(例如 256),将“全局”变量(实际上是文件范围)移动到
main(),检查fopen()的返回值,然后fclose()处理完您的文件。 -
命令行参数将在
argv[1]、argv[2]和argv[3]中(如果它们在那里);在这种情况下,argc将是 4。您应该(至少)验证已经给出了多少个参数,如果argc不完全是 4,则使用使用消息退出。 -
输入行有多长?如果某些输入行超过 256 个字符,则代码必须处理被
fgets截断的行。要么,要么你需要使用更大的行缓冲区。 -
现在你的代码更糟了(
char line[] = {};等)——我不确定它是否可以编译。 256有点小,但也不是不合理。您可以使用 4096 并忽略该问题,或者使用 POSIXgetline()并且在大多数情况下不必担心行长。