#c #io #stderr
#c #io #stderr
Вопрос:
g (GCC) 4.6.0 20110419 (Red Hat 4.6.0-5
)
что эквивалентно этому в c ? Я знаю, что это будет скомпилировано в g . Но мне просто интересно посмотреть, есть ли в c что-нибудь еще, что я мог бы использовать подобным образом.
fprintf(stderr, "Server failed to receive message [ %s ]n", stderror(errno));
Большое спасибо за любые предложения,
Ответ №1:
Как насчет:
std::cerr << "Server failed to receive message [" << stderror(errno)) << "]" << std::endl;
Комментарии:
1. @Macmade: Каким образом совершенно правильно?
std::endl
не более и не менее зависит от платформы, чемn
.2. Разница в том, что std::endl очищает буфер.
3. @Macmade:
std::cerr
в любом случае сбрасывается после каждой операции вывода.4. Верно… Но это не тот случай, когда std::cout … Поэтому в любом случае лучше использовать std::endl…
5. @Macmade, я удалил свой комментарий как раз перед тем, как узнал. Однако, полезно для кого-то другого, кто мог бы использовать эту информацию о заголовках. Спасибо.
Ответ №2:
Проверьте cerr в iostream. Это похоже на cout, но для stderr.
#include <iostream>
std::cerr << "Server failed to receive message [ " << stderror(errno) << " ]"
<< std::endl;
Или вы можете использовать boost::format, чтобы получить типобезопасный sprintf.
using namespace boost;
std::cerr
<< format("Server failed to receive message [ %s ]") % stderror(errno)
<< std::endl;
Комментарии:
1. 1 для
boost::format
. Вы можете выгрузитьformat
объект непосредственно в поток. Вам не нужен вызовstr()
.
Ответ №3:
Вы можете использовать выходной поток cerr.
cerr << "Server failed to receive message [ " << stderror(errno) << " ]" << endl;
Комментарии:
1. Я полагаю,
endl
очищает буфер, что было бы полезно для сообщения об ошибке. Это делает этот ответ лучше, чем тот, который используетn
.2. @MarkRansom:
cerr
сбрасывается после каждой операции вывода (по умолчанию) в любом случае, так что единственное различие междуn
иstd::endl
здесь в любом случае не имеет значения.
Ответ №4:
Более общий ответ: вы можете использовать любой объект istream с операторами stream. Существует множество других типов объектов, которые наследуются от istream. Например, объекты fstream представляют собой тип istream, используемый для ввода-вывода файлов. Существуют также объекты sstream (string stream), которые используются аналогично sprintf и sscanf.
При этом я бы с осторожностью относился к использованию потоковых операторов C вместо эквивалентов C (которые также поддерживаются в C .). Если вы используете операторы C , это очень затруднит интернационализацию.