Оболочка - это то, что поглощает ваш выходной файл, так как она готовит выходные файловые дескрипторы перед выполнением вашей программы.Невозможно заставить вашу программу прочитать входные данные до того, как оболочка захлопнет файл в одной командной строке оболочки.
Вам нужно использовать две команды, либо переместить, либо скопировать файл перед чтением:
mv file.txt filecopy.txt
./myprog < filecopy.txt > file.txt
Или же вывести копию и заменить оригинал:
./myprog < file.txt > filecopy.txt
mv filecopy.txt file.txt
Если вы не можете этого сделать, вам нужно передать имя файла вашей программе, которая открывает файл врежим чтения / записи и внутренняя обработка всех операций ввода-вывода.
./myprog file.txt # reads and writes according to its own rules