Когда лучше использовать cost iostreams над ReadFile, WriteFile, fprintf и т. Д ...? - PullRequest
8 голосов
/ 21 января 2010

Я считаю, что гораздо проще использовать потоки в c ++ вместо функций Windows, таких как ReadFile, WriteFile и т. Д., Или даже fprintf. Когда не стоит использовать потоки? Когда хорошо использовать потоки? Безопасно ли использовать потоки? Почему многие программисты не используют потоки?

Это просто то, о чем я всегда задумывался, и, может быть, вы можете пролить немного мудрости.

Ответы [ 7 ]

11 голосов
/ 21 января 2010

Потоки, как правило, довольно безопасны.При некоторых обстоятельствах они могут быть медленными и / или неуклюжими.Медленно, в основном, связано с тем, что они накладывают несколько дополнительных уровней между вашим кодом и ОС, и при неправильных обстоятельствах эти уровни могут добавить накладные расходы.Неуклюжесть в основном по сравнению с printf C, а не прямое использование чего-то вроде WriteFile (который вообще не поддерживает форматирование).Однако, например, рассмотрим:

printf("%2.2x", ch);` 

до

std::cout << std::hex << std::setw(2) << std::setprecision(2) << std::setfill('0') << ch; 
std::cout << setfill(' ');

Затем учтите тот факт, что если вам небезразличен i18n, printf использует строку, которую легко прочитать извнешний источник, где поток C ++ встраивает все форматирование в структуру кода, поэтому почти любое изменение в форматировании требует переписывания кода, перекомпиляции и перекомпоновки.

CreateFile, ReadFile и т. д. также позволяютмножество таких вещей, как файлы с отображением в памяти и перекрывающееся чтение и запись, которые вообще не поддерживаются iostreams.Если ситуация позволяет вам эффективно использовать их, iostreams часто не будет конкурентоспособным.

10 голосов
/ 21 января 2010

Когда не стоит использовать потоки?

  • Потоки не гарантируют многопоточность. Легко придумать ситуацию, когда вы не можете использовать потоки без некоторой синхронизации.
  • Потоковые объекты обычно довольно "тяжелые". Они могут быть слишком тяжелыми для нехватки памяти или встроенных сред.

Когда хорошо использовать потоки?

В общем.

Безопасно ли использовать потоки?

Да, но вы должны быть осторожны, когда делитесь потоком асинхронно.

Почему многие программисты не используют потоки?

Предпочтение, стиль, или они изучили другой метод (или другой язык) в первую очередь. Я нахожу, что множество старых примеров "c ++" онлайн написано с C-ароматом для них, предпочитая printf cout.

4 голосов
/ 21 января 2010

Вы не можете выполнять асинхронный файловый ввод / вывод с потоками ...

3 голосов
/ 21 января 2010
  1. Если вы хотите, чтобы ваше приложение было переносимым на разные платформы.

  2. Если вам нужно больше сжатого кода: функции win32 имеют более сложную семантику, часто для их выполнения требуется набор функций и определенно имеют больше параметров.

1 голос
/ 04 ноября 2016

Есть три варианта, которые вы упомянули здесь:

  1. C ++ потоки (ostream, istream, fstream)
  2. C stdio (printf, sprintf fprintf)
  3. Windows-файлы (ReadFile, WriteFile)

Опции 1 и 2 не зависят от платформы. Это означает, что вы можете скомпилировать код для Mac, Linux или многих других операционных систем. Вариант 3 только для Windows. Это означает, что вы не можете скомпилировать его ни для чего, кроме Windows.

При выборе между вариантами 1 и 2 все зависит от того, как вы хотите его использовать. Библиотека C проще в использовании в отношении языков. Это кошмарная попытка заменить текст альтернативными языками в потоках, однако гораздо проще сделать потоки безопасными для потоков, преобразовать более сложные классы в формат для печати и расширить возможности потоков.

C ++ iostream против C stdio - это очень горячий аргумент, который обсуждается во многих других местах на этом форуме, таких как C ++ Streams против ввода-вывода в стиле C? и других местах в Интернете.

1 голос
/ 21 января 2010

одна причина i18n

string time = "4:32";
cout << "the current time is " << time;
cout << "वर्तमान समय " << time << " है।"
cout << time << "في الوقت الحالي هو";

против

string format = "the current time is %s";
string format = "वर्तमान समय %s है।";
string format = "%s في الوقت الحالي هو";
printf(format, time);
1 голос
/ 21 января 2010

Одна из причин, по которой мне нравится printf (), заключается в том, что сами строки форматирования могут быть ресурсами, что обеспечивает больше внешнего контроля над выводом программы без принудительной перекомпиляции.

Одна из причин, по которой мне нравится cout () - это грубая скорость.

По моему опыту, это довольно религиозный вопрос.

...