I find that it is tremendously easier to use streams in c++ instead of windows functions like ReadFile, WriteFile, etc or even fprintf. When is it not good to use streams? When is it good to use streams? Is it safe to use streams? How come a lot of programmers don't use streams?
This is just something I've always wondered about and maybe you can shed some wisdom.
Streams are generally quite safe. Under some circumstances, they can be slow and/or clumsy. Slow, mostly stems from the fact that they impose a few extra layers between your code and the OS, and under the wrong circumstance those layers can add overhead. The clumsiness is mostly in comparison to C's printf, not direct use of something like WriteFile (which doesn't directly support formatting at all). For example, however, consider:
printf("%2.2x", ch);`
to
std::cout << std::hex << std::setw(2) << std::setprecision(2) << std::setfill('0') << ch;
std::cout << setfill(' ');
Then consider the fact that if you care about i18n, printf
is using a string that's easy to read in from an external source, where the C++ stream is embedding all the formatting into the structure of the code, so nearly any change in formatting requires rewriting the code, recompiling and relinking.
CreateFile, ReadFile
, etc, also allow a number of things like memory mapped files and overlapped reading and writing that aren't supported by iostreams at all. If the situation lets you make good use of these, iostreams often won't be competitive.
When is it not good to use streams?
When is it good to use streams?
In general.
Is it safe to use streams?
Yes, but you've got to be careful when sharing a stream asynchronously.
How come a lot of programmers don't use streams?
Preference, style, or they learned a different method (or different language) first. I find that plenty of old "c++" examples online are written with a C-flavor to them, prefering printf to cout.
You can't do asynchronous file i/o with streams ...
When you want your app to be portable to different platforms.
When you want more succinct code: win32 functions have more elaborate semantics, often require a collection of functions to do something, and definitely have more parameters.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With