С чем едят std::clog ?

Тема в разделе "LANGS.C", создана пользователем _DEN_, 11 июн 2007.

  1. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    std::cin, std::cout, std::cerr - это все понятно. А вот для чего сабж и что с ним делать?
     
  2. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    _DEN_
    clog - это буферизированный cerr.
     
  3. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    q_q

    Не понял?
     
  4. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    _DEN_
    для чего сабж и что с ним делать?
    Функциональность и завязка на stderr аналогична cerr. Только сообщения clog не сразу попадают на устройство вывода (обычно ассоциированное с дисплеем), а по заполнению внутреннего буфера. Если после каждого << делать flush, то будет аналог cerr.
     
  5. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    q_q

    А когда clog решает что пора флюшнуцца? И в чем прикол такого поведения?
     
  6. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    _DEN_ > пора флюшнуцца
    q_q > по заполнению внутреннего буфера

    в чем прикол такого поведения?
    С одной стороны буферизированный вывод быстрее, т.к. обращение к физическому устройству происходит по мере необходимости. С другой стороны, если программа вылетела, нет гарантии, что все сообщения попадут на устройство.
     
  7. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    q_q

    :derisive: Что такое буфферизованный и сквозной ввод/вывод я знаю)) Мне интересно в чем прикол делать буферизованным именно эрроровый пайп? cout ведь не делится на сквозной и буферизованый. Зачем cerr разделили? Или почему не разделили cout?
     
  8. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    _DEN_
    Надо спрашивать авторов.
    Мое объяснение такое. Стандартных потоков вывода три (stdaux не в счет) - stdout, stderr и stdprn. Первый ассоциируется с информационными сообщениями для пользователей. Второй, с сообщениями об ошибках для пользователей и разработчиков. Третий с "жесткой" копией информации. Лог ассоциируется с технологическими сообщениями для разработчиков, не путать с информационными сообщениями, которые информируют пользователя о протекании какого-либо длительного процесса. По принципу ориентированности на разработчиков логу роднее stderr.
     
  9. r90

    r90 New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    898
    представь себе apache на c++. так вот, такой гипотетический апач, вместо того, чтобы пользоваться функцией syslog для логирования своей работы (он вероятнее пользуется какой-то своей обёрткой syslog), мог бы свободно выводить в std::clog.
     
  10. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    r90

    Бугаго)) А еще он бы мог выводить в std::cout, std::cerr, std::ofstream, std::wofstream, std::ostream, .... и еще в 50 мест.

    И ЧТО?
     
  11. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    _DEN_
    Вот что случается с теми, кто не любит читать Страуструпа :)
    Ты же понимаешь разницу между обычным и буферизированным выводом, чем тебя не устраивает наличие clog'a как буферизированного варианта cerr'a?
     
  12. r90

    r90 New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    898
    ДА НИЧЕГО! замечу в std::ofstream отправить что-то сложно ;)
    это просто стандартное имя для отправки логов. по дефолту идёт в консоль, а не в syslog, просто потому, что, имхо, syslog довольно-таки платформозависимая фича. может ещё, может быть, потому, что всё-таки отлаживать удобнее когда всё кладётся в одну кучу, не засирая при этом системный лог. в чём разница между логами и ошибками q_q описал -- это мало того, что вполне оправдывает буферизацию, так ещё и на мысли должно наводить о том, что пихать логи в тот же поток, куда и ошибки не всегда кошерно. или тебе ещё рассказать какой резон тому же apache закрывать дескрипторы 0, 1, 2 после завершения инициализации -- чтения всяких-там конфигов, и проверки их работоспособности?
     
  13. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    IceStudent

    Я не говорю что он меня не устраивает. Я же написал: почему с std::cout и std::cerr обошлись по-разному. Последний разделили на буфферизованный и сквозной, а первый - нет. Если такое решение было принято комитетом по стандартизации С++, я думаю это не просто так. На это были какие-то причины. Вот именно эти причины меня и интересутуют. А как там рабоает апач, сколько травы скурил Страуструп и как выучить С++ за 21 день - мне совершенно по барабану. Меня не интересуют прикладные вопросы. Меня интересует сам язык.