Reading transactions from blk*.dat files
Yes, it is possible.

According to Order of transactions within a block, transactions within a block must be listed in the "correct" order: a transaction may only spend outputs of transactions listed earlier in the same block, or in previous blocks.  

However, blocks do not necessarily appear in the blk*.dat files in their proper order, but rather in the order in which they were downloaded.  If A,B are two blocks, and the prevBlockHash of B is the hash of A, it's still possible that B appears before A in the file.  In that case, a valid transaction may reference outputs from a transaction that appears later in the file, though earlier in the block chain.

It's also worth noting that blk*.dat can contain orphaned blocks.  So you may find two different transactions in the blk*.dat files that spend the same input.  You'll then have to determine which of them is in a block that is part of the longest chain (measured by total work), and which is on an orphan side chain.