Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Преобразование числа типа double


Автор: pablo 7.4.2005, 11:11
Поскажите как преобразовать число из типа double в строку char*.
Опытные люди сказали, что надо юзать ostrstream, но каким образом ???
Может у кого есть какие идеи ???

Автор: Alastis 7.4.2005, 12:10
Можно так:

Код

double val = 1234.56;//что записываем 
char *buf;// куда записываем 
int digits = 6;//кол-во цифр, которые будут записаны 
gcvt(val, digits, buf); 


или так:

Код

double f; 
char *buf; 
sprintf(buf, "%f", f);

Автор: pablo 7.4.2005, 12:21
Прекрасно, всё работает. Спасибо огромное.

Автор: Alastis 7.4.2005, 12:23
еще вот попробуй, если нужно через ostrstream:

Код

    std::string conv(double n)
    {
        std::ostrstream stream;
        stream << n;
      return stream.str();
    }

Автор: Fire-Plug 7.4.2005, 22:18
Цитата(Alastis @ 7.4.2005, 12:23)
 
Код

 return stream.str();

Ф-ция ostrstream::str() возвращает указатель на С-строку без 0-терминатора.
Что нужно сделать в твоем решении - использовать streamsize ostrstream::pcount( ) в конструкторе string:
Код

    std::string conv(double n)
    {
        std::ostrstream stream;
        stream << n;
      return std::string(stream.str(), stream.pcount());
    }


Автор: yaja 8.4.2005, 17:56
А есть способ сделать ето преобразование гораздо быстрее smile
char *_gcvt(
double value,
int digits,
char *buffer
);

Автор: Void 8.4.2005, 18:25
Цитата(Fire @ 7.4.2005, 22:18)
Ф-ция ostrstream::str() возвращает указатель на С-строку без 0-терминатора.

С каких пор? Он возвращает std::string, чтобы получить C-строку, надо stream.str().c_str()

Автор: srd 8.4.2005, 18:32
Цитата(yaja @ 9.4.2005, 00:56)
А есть способ сделать ето преобразование гораздо быстрее
char *_gcvt(
double value,
int digits,
char *buffer
);

Зато это не переносимо smile

Автор: yaja 8.4.2005, 22:45
Цитата
Зато это не переносимо smile

Не знал smile

Автор: Fire-Plug 10.4.2005, 07:40
Цитата(Void @ 8.4.2005, 18:25)
Цитата (Fire-Plug @ 7.4.2005, 22:18)
Цитата
Ф-ция ostrstream::str() возвращает указатель на С-строку без 0-терминатора.

С каких пор? Он возвращает std::string, чтобы получить C-строку, надо stream.str().c_str()

Действительно, а с каких пор?
ИМХО, когда strstream и производные от него ostrstream & istrstream были разработаны и введены в С++ в качестве потоковых классов. Наверное, это было то самое время, когда вместо заголовочного файла <strstream> приходилось использовать <strstream.h>, а о том, что будет такой std::string не знал даже А.Степанов.
1) Объявление метода ostrstream::str():
Код

char * str();

Вопрос: типы char * и std::string тождественны? С каких пор?
2) Семантика возвращаемого значения метода ostrstream::str():
Цитата
Returns a pointer to the internal character array

Кто-нибудь пробовал использовать что-либо вроде:
Код

ostrstream strm;
strm << blah << blah << blah; 

int len= strlen(strm.str());

Не пробовали? Ну и правильно. Дело может окончиться исключ. ситуацией с кодом EXCEPTION_ACCESS_VIOLATION.
ЗЫ: Если бы контролируемая последовательность в классе strstream имела 0-терминатор, накой тогда был бы нужен метод pcount().

Автор: Void 10.4.2005, 08:13
Цитата(Fire @ 10.4.2005, 07:40)
Действительно, а с каких пор?
ИМХО, когда strstream и производные от него ostrstream & istrstream были разработаны и введены в С++ в качестве потоковых классов. Наверное, это было то самое время, когда вместо заголовочного файла <strstream> приходилось использовать <strstream.h>, а о том, что будет такой std::string не знал даже А.Степанов.

Хех, прошу прощения, не заметил разницы между strstream и stringstream. Но тогда встречный вопрос: зачем пользоваться deprecated классами strstream и файлом <strstream.h> вместо стандартного <sstream> и stringstream?

Автор: Fire-Plug 10.4.2005, 08:52
Цитата(Void @ 10.4.2005, 08:13)
Но тогда встречный вопрос: зачем пользоваться deprecated классами strstream и файлом <strstream.h> вместо стандартного <sstream> и stringstream

Просто пример был, где предлагалось сконструировать std::string с помощью только strstream::str(). Ну, на ошибку надо было указать. А так, конечно, deprecated классами пользоваться незачем: хлопотно да и error-prone.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)