p.s. ho dimenticato di copiarti l'esempio di fwrite()/fread()
Questo appende n files (a tua scelta quanti e quali) in uno nuovo
Ci avevo messo anche parekki commenti quindi dovrebbe essere di facile comprensione

codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define BUFSIZE 1024	//Grandezza in bytes del buffer
#define SLEN 20		//Lunghezza max nome files

void append(FILE *, FILE *);	//Parametri: file da appendere, file in cui appendere

void main(){

    FILE *fileAppend, *fileSource;
    int files = 0;  // Nr file appesi
    char file_app[SLEN];  // Nome file in cui appendere tutti gli altri
    char file_src[SLEN];  // Nome file da appendere

	puts("Enter name of destination file:");
    gets(file_app);

	if(!(fileAppend = fopen(file_app, "a")))
		abort();

	//Ridefiniamo la dimensione del buffer. In tal modo possiamo passare fino a BUFSIZE bytes per volta
    if(setvbuf(fileAppend, NULL, _IOFBF, BUFSIZE)){		//0 è il valore ritornato in caso di successo.
        fputs("Can't create output buffer\n", stderr);
        abort();
    	}

	puts("Enter name of first source file (empty line to quit):");
		while(gets(file_src) && file_src[0] != '\0'){		//Se il primo char della stringa ne indica la fine allora non è stato inserito nulla
			if(strcmp(file_src, file_app) == 0)
            	fputs("Can't append file to itself\n",stderr);
			else if(!(fileSource = fopen(file_src, "r"))){
				fprintf(stderr, "Can't open %s\n", file_src);
				break;
				}

			append(fileSource, fileAppend);
            fclose(fileSource);
            files++;
            printf("File %s appended.\n", file_src);
            puts("Next file (empty line to quit):");
			}

    printf("Done. %d files appended.\n", files);
    fclose(fileAppend);
}

void append(FILE *source, FILE *dest){

	size_t bytes;
    static char temp[BUFSIZE]; 	//Variabile statica, allochiamo solo una volta.

    while ((bytes = fread(temp,sizeof(char),BUFSIZE,source)) > 0)
        fwrite(temp, sizeof(char), bytes, dest);
}