Unless I missed something, nobody has pointed out that you are opening your output files probably multiple times (maybe million times) within a probable read loop (you did not show enough of your code for us to figure out exactly what your are doing) and that, each time you do that, you overwrite the content gathered the previous file version. So that, at the end, you get in the file what gathered for the last input line, which might be nothing if /ABC/ does not match. Whereas if you print to the screen, you get the full output.
You might have solved the issue with another technique, but I think that if you showed us more of your code, we could give you a much better solution, probably based on the idea of opening the output file before entering the read loop.