Printing fizzy lines
Design:


Good job on setting up everything in main(), then passing off control to another function.
Declare and initialize file after checking the command line arguments.
Initialize fizz, buzz, and count.
Don't use !feof(file) to control your loop.  See this answer for more details.
Check the return value of fscanf() to make sure we're reading good data.
Good job remembering to close the file.


Readability &amp; Maintainability/Performance

I'm grouping these two categories together for this review, since they happen to go hand in hand.


Your for loop can be refactored down a bit:

if (i % fizz == 0) fputc('F', stdout);
if (i % buzz == 0) fputc('B', stdout);
if (i % fizz &amp;&amp; i % buzz)) fprintf(stdout, "%d", i);


Some people may find issue with the duplicated check on i with fizz and buzz, but we cut out some conditional branches doing this and the more branches we cut, the less susceptible to branch prediction we are.  There may be a better way to write this, but I can't think of it right now.
Note how I used fputs() and fputc() in the code above instead of printf().  This is because those functions are \$ O(1) \$ operations instead of \$ O(n) \$ to loop over the string and format it.  This may speed up your program by a hair, if that, but the main reason I recommend this change is to make clear we aren't modifying any strings.
Since the range of \$ X \$, \$ Y \$, and \$ N \$ is 1-20, it would be good to change the type representing these variables to something a bit more compact in memory.  

Depending on what we want to optimize for (memory or performance), I would recommend either uint_least8_t or uint_fast8_t.


uint_least8_t: give me the smallest type of unsigned int which has at least 8 bits. Optimize for memory consumption.
uint_fast8_t: give me an unsigned int of at least 8 bits. Pick a larger type if it will make my program faster, because of alignment considerations. Optimize for speed.