Ахтунги с std::endl

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

  1. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Код (Text):
    1. #include <sstream>
    2. #include <fstream>
    3.  
    4. int main()
    5. {
    6.     std::stringstream sout;
    7.     std::ofstream     fout("test.txt");
    8.  
    9.     sout << std::endl;
    10.     fout << std::endl;
    11.  
    12.     std::string str = sout.str();
    13.  
    14.     return 0;
    15. }
    В файл уйдет 0x0D, 0x0A. В строке будет 0x0A, 0x0D. Почему?
    Из-за этого при сборке HTTP-заготовка приходится писать руками "\r\n", а не std::endl. Нельзя ли с этим что-нибудь сделать?
     
  2. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Оно автоматически выбирает \r\n или \n в зависимости от того, на какой платформе и куда пишется. Но вот чтоб наоборот \n\r писало - впервые слышу.

    Собсно, для http прямо и надо указывать.
     
  3. _DEN_

    _DEN_ DEN

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

    В этом не сложно убедиться :derisive:
     
  4. maxdiver

    maxdiver Max

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    308
    Адрес:
    Саратов
    __DEN__
    А ты уверен, что в строке \n\r?
    У меня VS 2005 SP1, в строке оказывается просто \n.

    Собственно, я не понимаю, откуда там могло взяться \r, если даже в исходниках <ostream> прописано только \n.
     
  5. _DEN_

    _DEN_ DEN

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

    У меня на домашней студии такие приколы. Посмотрю вечерком.
     
  6. maxdiver

    maxdiver Max

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    308
    Адрес:
    Саратов
    __DEN__
    В строке вряд ли появится что-то кроме \n, если так написано в исходниках.
    А вот при выводе в файл - запросто. CRT может подменять все \n на \r\n.
     
  7. kaspersky

    kaspersky New Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    3.006
    проверил на ms vc 6, gcc и intel C++ (под линух).
    в строке всегда \xA,
    в файле: под вынь - \xD\xA, под линух - \xA.
    хотя можно было и не проверять, результат предсказуем заранее ;)
     
  8. qwerty_9876

    qwerty_9876 New Member

    Публикаций:
    0
    Регистрация:
    10 апр 2007
    Сообщения:
    47
    Читайте crt исходники и наступит просветление.
    Может из-за этого(где-то в crt):

    while ( q - lfbuf < BUF_SIZE - 1 &&
    (unsigned)(p - (char *)buf) < cnt ) {
    ch = *p++;
    if ( ch == LF ) {
    ++lfcount;
    *q++ = CR;
    }
    *q++ = ch;
    }


    PS. vs2003
     
  9. maxdiver

    maxdiver Max

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    308
    Адрес:
    Саратов
    qwerty_9876
    Ну дык с файлами и так всё понятно :)
    А вот в строке - непонятно, откуда там могло \r взяться. _DEN_ обещал посмотреть у себя, но что-то ничего не написал.
     
  10. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Да, прошу прощения за глюк. Действительно, в std::stringstream выводдится только 0x0A. Программирование ночью после тяжелого трудового дня ни к чему хорошему не приводит :dntknw: