%d, %s e %c, o que chamamos especificadores de formato, são usados em funções de IO para definir o tipo de dado a ser lido/escrito. Particularmente úteis quando se tem interesse em usar dados formatados. Todos os especificadores começam com o caráter %, seguido de um ou mais caracteres. Estes que você citou, em particular, designam, respectivamente, inteiro, string e caráter.
Para uma lista mais completa, veja o link
No seu caso em concreto:
fseek(f, 0, SEEK_SET);
// imprime o valor de qtd no arquivo apontado por f
// qtd é uma variável inteira
fprintf(f, "%d", qtd);
fseek(f, 0, SEEK_END);
// imprime o conteúdo de novapalavra no arquivo apontado por f
// novapalavra é uma string
fprintf(f, "\n%s", novapalavra);
A função fprintf é declarada como:
int fprintf(FILE * restrict stream, const char * restrict format, ...);
Isso significa 2 argumentos obrigatórios e uma lista variável de argumentos adicionais. A saber, o primeiro aponta para um arquivo, o segundo é uma string que descreve o formato/tabulação dos dados, os demais argumentos devem coincidir com a string de formato, substituindo, termo a termo, os elementos contidos na string.
Ex:
#include <stdio.h>
int main(int argc, char *argv[]) {
const int d = 1;
const char *const s = "um";
const char c = '1';
fprintf(stdout, "%d - %s - %c\n", d, s, c);
return 0;
}