Neither of them are particularly efficient, they both are flexible in their own ways. Output streams "<<" not can extract data from defined stream function for that particular data type/class. "fprintf(...)" Allows the flexibility to use many different data types and format them.