S-a mai raspuns la aceasta intrebare.
freopen("d.in", "r", stdin);
freopen("d.out", "w", stdout);
scanf("%d %d", &N, &M);
printf("%d %d", N, M);
Apelurile freopen() face ca intrarea/iesirea standard sa fie din fisier.
Legat de doua intrebare, greseala e ca citesti si caracterul '\n' (sfarsit de linie) si trebuie sa te asiguri ca sari peste el.
De exemplu fscanf(f,"%d\n",&n); la inceput si citesti un caracter in plus la sfarsitul fiecarei linii.