Caesar Cipher that takes an arbitrary offset
Some comments on your updated code in Rev 3:


I would define your constants as follows:

#define LSTART ('a')
#define USTART ('A')
#define NALPHA ('z' - 'a' + 1)


You now need no comments - they are obvious.
It would be normal to use perror(argv[1]); to print the error on opening
the file.
My man-page says atoi has been depracated in favour of strtol
return values from main are traditionally EXIT_FAILURE and EXIT_SUCCESS
I would define offset and wrap at their point of first use.  Also it is
generally recommended not to define multiple variables on one line.
In the while loop you should put the fputc(ec, stdout); outside the
if(isalpha(ec)) {...} condition.  That way the format of what you encrypt
is maintained.  Equally, I would omit printing \n at the end so that the
output file (on stdout) has the same form as the input.
I prefer to see a space after keywords, if, while etc. 
Don't overuse ?: - it is not a universal replacement for if-else
I find a character named ec to be less intuitive than one named ch, but
maybe that is just me.
I think your encryption code: 

    int ascii_offset = islower (ec) ? LSTART : USTART;

    wrap = (ec + offset - ascii_offset) % NALPHA;
    wrap = (wrap &lt; 0) ? NALPHA + wrap : wrap;
    ec = islower(ec) ? wrap + LSTART : wrap + USTART;


would be better written:

    const int ascii_offset = islower(ec) ? LSTART : USTART;
    int wrap = (ec + offset - ascii_offset) % NALPHA;
    if (wrap &lt; 0) {
        wrap += NALPHA;
    }
    ec = wrap + ascii_offset;