Si pones fopen ("fichero.txt", "w") el fichero se crea en el diretorio actual. Si ejecutas el programa desde una linea de ms-dos, se creara en el directorio en el que estés en ese momento. Si lo ejecutas desde visual c++ o c++ builder o lo que sea, depende de cómo esté eso configurado. Posiblemente se cree en el mismo directorio en el que esté el .exe compilado
Si pones fopen ("C:\\un_Paht\\un_fichero.txt", "w") el fichero se crea en el path que tu digas.
En cuanto al fichero .dat, como crearse se crea igual. Si con .dat te refieres a un fichero que no sea de texto, sino binario, debes poner la opcion "wb" en el fopen(). Luego, en vez de escribir con fprintf(), debes escribir con fwrite().
FILE *fichero = fopen ("fichero_binario.dat", "wb");
struct MiEstructuraDeDatos a;
a.campo1 = ...;
...
a.campon = ...;
fwrite (&a, sizeof(a), 1, fichero);
Se bueno.