| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 | /* append.c -- appends files to a file */#include <stdio.h>#include <stdlib.h>#include <string.h>#define BUFSIZE 4096#define SLEN 81void append(FILE *source, FILE *dest);char * s_gets(char * st, int n);int main(void){    FILE *fa, *fs;	// fa for append file, fs for source file    int files = 0;  // number of files appended    char file_app[SLEN];  // name of append file    char file_src[SLEN];  // name of source file    int ch;        puts("Enter name of destination file:");    s_gets(file_app, SLEN);    if ((fa = fopen(file_app, "a+")) == NULL)    {        fprintf(stderr, "Can't open %s\n", file_app);        exit(EXIT_FAILURE);    }    if (setvbuf(fa, NULL, _IOFBF, BUFSIZE) != 0)    {        fputs("Can't create output buffer\n", stderr);        exit(EXIT_FAILURE);    }    puts("Enter name of first source file (empty line to quit):");    while (s_gets(file_src, SLEN) && file_src[0] != '\0')    {        if (strcmp(file_src, file_app) == 0)            fputs("Can't append file to itself\n",stderr);        else if ((fs = fopen(file_src, "r")) == NULL)            fprintf(stderr, "Can't open %s\n", file_src);        else        {            if (setvbuf(fs, NULL, _IOFBF, BUFSIZE) != 0)            {                fputs("Can't create input buffer\n",stderr);                continue;            }            append(fs, fa);            if (ferror(fs) != 0)                fprintf(stderr,"Error in reading file %s.\n",                        file_src);            if (ferror(fa) != 0)                fprintf(stderr,"Error in writing file %s.\n",                        file_app);            fclose(fs);            files++;            printf("File %s appended.\n", file_src);            puts("Next file (empty line to quit):");        }    }    printf("Done appending. %d files appended.\n", files);    rewind(fa);    printf("%s contents:\n", file_app);    while ((ch = getc(fa)) != EOF)        putchar(ch);    puts("Done displaying.");    fclose(fa);        return 0;}void append(FILE *source, FILE *dest){    size_t bytes;    static char temp[BUFSIZE]; // allocate once        while ((bytes = fread(temp,sizeof(char),BUFSIZE,source)) > 0)        fwrite(temp, sizeof (char), bytes, dest);}char * s_gets(char * st, int n){    char * ret_val;    char * find;        ret_val = fgets(st, n, stdin);    if (ret_val)    {        find = strchr(st, '\n');   // look for newline        if (find)                  // if the address is not NULL,            *find = '\0';          // place a null character there        else            while (getchar() != '\n')                continue;    }    return ret_val;}
 |