эквивалент fprint в c

#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 , это очень затруднит интернационализацию.