A few experiments for my own pleasure (and for anyone else interested in the question).
I generated a 100 MB afile
using /dev/urandom and tried a few pipelines and redirects using the same file.
Most of the following commands don't make logical sense (as a "successful" result should keep the file unchanged) and it should also be noted that if different files are specified for input and output, all of the commands result in a complete copy of the input.
Here's a few of the results:
$ cat <afile >afile
Definition: cat stdin from afile and redirect to afile.
Result: afile is truncated (0 bytes)
$ cat afile|cat >afile
Definition: cat afile and pipe stdout to another cat, redirected to afile.
Result: afile is truncated (0 bytes)
$ tee afile <afile >/dev/null
Definition: tee stdin from afile and write to afile (and redirect stdout to /dev/null).
Result: afile is truncated (0 bytes)
$ cat afile|tee afile >/dev/null
Definition: cat afile and pipe stdout to tee (and redirect tee stdout to /dev/null).
Result: afile is reduced to 128 KB
The last entry shows the problem most clearly: cat only manages to buffer 128 KB and pipe it to tee before the file is gone. So if your file is small you might be lucky, but it's best to heed the answer and always separate input and output files.