【发布时间】:2020-07-31 15:25:26
【问题描述】:
我一直在尝试将两个.txt 文件的内容合并到第三个.txt 文件中,该文件结合了输出。然而,我所知道的(以及我所能找到的所有答案)是通过将第一个文件的内容放在第一位,然后将第二个文件的内容放在第二位来合并它们。但是,我希望输出列出第一个文件的第一行,然后是第二个文件的第一行——然后在新行上依次是第一个文件的第二行和第二个文件的第二行。
为了使这一点在视觉上更清晰,代码当前显示为:
file1-line1
file1-line2
file1-line3
file2-line1
file2-line2
file2-line3
...当我希望它显示为:
file1-line1 file2-line1
file1-line2 file2-line2
file1-line3 file2-line3
我的代码非常基础,可以很好地执行第一个示例:
int main()
{
FILE *pointer1 = fopen("file1.txt", "r");
FILE *pointer2 = fopen("file2.txt", "r");
FILE *pointer3 = fopen("combined.txt", "w");
int ch;
if (pointer1 == NULL || pointer2 == NULL || pointer3 == NULL)
{
puts("Could not open files");
exit(0);
}
while ((ch = fgetc(pointer1)) != EOF)
fputc(ch, pointer3);
while ((ch = fgetc(pointer2)) != EOF)
fputc(ch, pointer3);
printf("Merged file1.txt and file2.txt into combined.txt");
fclose(pointer1);
fclose(pointer2);
fclose(pointer3);
return 0;
}
有没有办法输出所描述的情况?我知道E0F 指的是文件的结尾,并且可能会导致问题。行尾是否有类似的情况(如 E0L)?
编辑:将char ch 更改为int ch。
【问题讨论】:
-
如果您使用行,使用
fgets更容易,或者使用fgetc阅读直到行尾。使用运行的 while 循环,同时您可以从两个文件中获取一行。一旦任何文件用完,只需写入另一个文件的剩余部分。 -
一般情况下,打开文件出错会被视为失败。因此,您应该编写错误消息并以非零值退出,而不是写入输出并以 0 退出。例如
perror("file1.txt"); exit(1); -
我投票结束,因为该问题缺乏对特定编程问题的关注。我的意思是 OP 所取得的成就与他们的目标相去甚远,无法通过一个 Q/A 来处理。我的建议是分成更小的步骤,并将这个问题改为只关注第一步 - 或其问题。我建议作为第一步从交错的两个文件中获取输入,即:file1-line1、file2-line1、file1-line2、file2-line2、file1-line3、file2-line3。下一步是询问如何在一行中分别放置两行。
-
小而重要的一点:
char ch;应该是int ch;(看看库函数原型)虽然你可能在文本文件处理中“侥幸逃脱”,但你不会你处理一个二进制文件。 -
尝试一次读取一个字符。当您看到换行符时,请更改您正在读取的文件,并根据需要写入换行符或分隔符。