您好我最近在C中接受了一项任务。
该任务的目的是从两个文本文件中读取并并排输出每个文件的每一行,并在所述行的中间分隔一个字符串。
示例:
文件1包含:
green
blue
red
文件2包含:
rain
sun
separator string = xx
输出=
greenxxrain
bluexxsun
redxx
我设法做到这一点,但想知道是否有其他人有任何替代方案。这是我的代码:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int f1, f2;
FILE *file1, *file2;
file1 = fopen("textone", "r"); //open file1 for reading.
file2 = fopen("texttwo", "r"); //open file2 for reading.
//if there are two files ready, proceed.
if (file1 && file2){
do{
//read file1 until end of line or end of file is reached.
while ((f1 = getc(file1)) != '\n' && f1!= EOF ){
//write character.
putchar(f1);
}
//print separator string.
printf("xx");
//read file2 until end of line or end of file is reached.
while ((f2 = getc(file2)) != '\n' && f2!= EOF ){
//write character.
putchar(f2);
}
putchar('\n');
//do this until both files have reached their end.
}while(f1 != EOF || f2 != EOF);
}
}
答案 0 :(得分:1)
您可能会发现fgets(3)
有用。它可以用于一次读取整行。也就是说,它也有缺点 - 例如,您需要知道线路的长度,或者至少处理线路比缓冲区长的情况。你的实现对我来说似乎很好(除了你应该调用fclose(3)
)。
答案 1 :(得分:0)
您可以编写一个简单的函数来避免do { ... } while
循环中的“大”重复:
static void read_and_echo_line(FILE *fp)
{
int c;
while ((c = getc(fp)) != EOF && c != '\n')
putchar(c);
}
...
do
{
read_and_echo_line(file1);
printf("xx");
read_and_echo_line(file2);
putchar('\n');
} while (!feof(file1) || !feof(file2));
在这种情况下,如图所示使用feof()
是相当合理的(虽然它不是大部分时间都使用的功能)。可替换地:
static int read_and_echo_line(FILE *fp)
{
int c;
while ((c = getc(fp)) != EOF && c != '\n')
putchar(c);
return(c);
}
...
do
{
f1 = read_and_echo_line(file1);
printf("xx");
f2 = read_and_echo_line(file2);
putchar('\n');
} while (f1 != EOF || f2 != EOF);