I want my program to send data to both stdout and to a file but nothing comes until the program ends?

There is a program called unbuffer. You could try using it like (tee takes care of sending both to stdout and to a file):

unbuffer your_program |tee some_output_file