Боковой конкатенат - PullRequest
       15

Боковой конкатенат

0 голосов
/ 08 марта 2012

Привет, мне недавно дали задание на C.

Цель задачи - прочитать два текстовых файла и вывести каждую строку каждого файла рядом со строкой-разделителем в середине этих строк.

Пример:

файл 1 содержит:

green
blue
red

файл 2 содержит:

rain                                
sun

строка-разделитель = 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);
    }
}

Ответы [ 2 ]

1 голос
/ 08 марта 2012

Вы можете найти fgets(3) полезным.Он может быть использован для чтения всей строки сразу.Тем не менее, у него есть и недостатки: вам нужно знать, например, какова длина строки или, по крайней мере, обработать случай, когда строка длиннее вашего буфера.Мне кажется, что ваша реализация в порядке (за исключением того, что вы должны вызывать fclose(3)).

0 голосов
/ 08 марта 2012

Вы можете написать простую функцию, чтобы избежать «большого» повторения в цикле 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);
...