1. Стандартный вывод никак не отличается от остальных файлов. Собственно, стандартным выводом может быть любой файл, терминал, пайп, сокет… и т.д. Это на уровне самой «оси».
2. Но ваша «проблема» — не на уровне оси, а на уровне абстракции FILE* из «stdio.h». Ваша проблема это «проблема» буферизации ввода/вывода. Ввод/вывод который «stdio.h» он идет не напрямую, а через буфер. Который может быть «без буферизации» / «построчная буферизация» / «полная буферизация». И это не баг а фича, буферизация способна нехило увеличить производительность ввода вывода.
Когда библиотека времени исполнения инициализирует stdin,stdout,stderr для дескрипторов 0,1,2 она смотрит на типы файлов (спрашивает у оси). И если это «терминал» то включает построчную буферизацию (т.е. системный вызов write() реально происходит когда заполняется строка до '\n'), а если «файл» то полную (т.е. пока буфер не заполнится его в файл не сбрасываем, либо по явному вызову fflush(sdtout);).
3. Собственно, вам поможет явное выполнение:
setlinebuf(stdout); // Включаем построчную буферизацию, как для терминала
Все! Вы конечно, можете вообще выключить буферизацию, но этого не стоит делать.