Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.57/37: Рейтинг темы: голосов - 37, средняя оценка - 4.57
анимешник++
95 / 62 / 7
Регистрация: 03.11.2009
Сообщений: 427
1

TCHAR + float != дружба или плохой wsprintf

26.02.2011, 22:55. Показов 7138. Ответов 12

вот столкнулся с проблемой перевода float числа в строчку и наоборот:
C++
1
2
TCHAR milage[9];
wsprintf(milage,"%f\0",Machines[Machines.processing].Mileage);//3й аргумент - float число, допустим 122.2
Ессно не работает - в строчке только буковка "f" остается.
порывшись на просторах гугла нашел swprintf, который тоже безуспешно работал - ошибку по синтаксису выдавал, хотя писал как надо было:
C++
1
swprintf(milage,9,"%f\0",Machines[Machines.processing].Mileage);//ругается на синтаксис
Строки нужны именно в TCHAR - выводить потом в editbox`ы.
И если можно - обратную конвертацию тоже.
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.02.2011, 22:55
Ответы с готовыми решениями:

Хороший или плохой тон программирования
вот в книгах читаю что гото туфта полная..на форуме тоже так говорят,а почему?очень нужная...

wsprintf не работает с float
Пиши калькулятор на Win Api, столкнулся с тем что функция wsprintf не работает с float. Проблема...

Компьютер плохой или кто плохой?
У меня проблема, мучаюсь с ней давно, все игры раньше 2005 года идут, а позже идут но с задержками...

Дружба или отношения
Привет всем, прошу умного совета. Ситуация следующая: мне нравится девушка и она учиться со мной...

12
Модератор
Эксперт по электронике
8514 / 6329 / 857
Регистрация: 14.02.2011
Сообщений: 21,978
26.02.2011, 23:41 2
int wvsprintf( LPTSTR lpOutput,
LPCTSTR lpFmt,
va_list arglist
);

lpOutput
[out] Pointer to a buffer to receive the formatted output. The maximum size of the buffer is 1024 bytes.
lpFmt
[in] Pointer to a null-terminated string that contains the format-control specifications. In addition to ordinary ASCII characters, a format specification for each argument appears in this string. For more information about the format specification, see wsprintf.
arglist
[in] A variable argument list; each element of the list specifies an argument for the format-control string. The number, type, and interpretation of the arguments depend on the corresponding format-control specifications in the lpFmt parameter.
Return Value

If the function succeeds, the return value is the number of TCHARs stored in the buffer, not counting the terminating null character. This refers to bytes for ANSI versions of the function or WCHARs for Unicode versions.

If the function fails, the return value is less than the length of the expected output. To get extended error information, call GetLastError.
MSDN

Добавлено через 8 минут
там же
Read formatted data from a string. More secure versions of these functions are available; see sscanf_s, _sscanf_s_l, swscanf_s, _swscanf_s_l.


int sscanf(
const char *buffer,
const char *format [,
argument ] ...
);
int _sscanf_l(
const char *buffer,
const char *format,
locale_t locale [,
argument ] ...
);
int swscanf(
const wchar_t *buffer,
const wchar_t *format [,
argument ] ...
);
int _swscanf_l(
const wchar_t *buffer,
const wchar_t *format,
locale_t locale [,
argument ] ...
);


Parameters
buffer
Stored data

format
Format-control string. For more information, see Format Specifications.

argument
Optional arguments

locale
The locale to use

Return Value
Each of these functions returns the number of fields successfully converted and assigned; the return value does not include fields that were read but not assigned. A return value of 0 indicates that no fields were assigned. The return value is EOF for an error or if the end of the string is reached before the first conversion.

If buffer or format is a NULL pointer, the invalid parameter handler is invoked, as described in Parameter Validation. If execution is allowed to continue, these functions return -1 and set errno to EINVAL.

For information on these and other error codes, see _doserrno, errno, _sys_errlist, and _sys_nerr.

Remarks
The sscanf function reads data from buffer into the location given by each argument. Every argument must be a pointer to a variable with a type that corresponds to a type specifier in format. The format argument controls the interpretation of the input fields and has the same form and function as the format argument for the scanf function. If copying takes place between strings that overlap, the behavior is undefined.

Security Note:
When reading a string with sscanf, always specify a width for the %s format (for example, "%32s" instead of "%s"); otherwise, improperly formatted input can easily cause a buffer overrun.


swscanf is a wide-character version of sscanf; the arguments to swscanf are wide-character strings. sscanfdoes not handle multibyte hexadecimal characters. swscanf does not handle Unicode full-width hexadecimal or "compatibility zone" characters. Otherwise, swscanf and sscanf behave identically.

The versions of these functions with the _l suffix are identical except that they use the locale parameter passed in instead of the current thread locale.
Добавлено через 7 минут
1 swprintf(milage,9,"%f\0",Machines[Machines.processing].Mileage);//ругается на синтаксис
В чем ругается конкретнее на какой параметр
может надо привести строку
пример из MSDN
C++
1
2
wchar_t buf[100];
   int len = swprintf( buf, 100, L"%s", L"Hello world" );
Добавлено через 1 минуту
"%f\0"
а почему не "%f"
1
анимешник++
95 / 62 / 7
Регистрация: 03.11.2009
Сообщений: 427
27.02.2011, 00:02  [ТС] 3
"%f\0"
а почему не "%f"
чтобы наверняка вставить конец строки.
wchar_t buf[100];
int len = swprintf( buf, 100, L"%s", L"Hello world" );
нужно TCHAR, а не wchar_t. А можно просто swprintf( buf, 100, L"%s", L"Hello world" ) ? мне не нужно возвращаемое значение.
Пробовал и swprintf_s - результат тот-же. Сейчас добавлю ошибку.

Добавлено через 1 минуту
На строку
C++
1
swprintf(milage,9,"%f\0",Machines[Machines.processing].Mileage);
выдает ошибку:
error C2665: 'swprintf' : none of the 2 overloads could convert all the argument types
1> c:\program files\microsoft visual studio 10.0\vc\include\swprintf.inl(36): could be 'int swprintf(wchar_t *,size_t,const wchar_t *,...)'
1> c:\program files\microsoft visual studio 10.0\vc\include\swprintf.inl(85): or 'int swprintf(wchar_t *,const wchar_t *,...)'
1> while trying to match the argument list '(TCHAR [9], int, const char [4], float)'
Добавлено через 2 минуты
Цитата Сообщение от ValeryS Посмотреть сообщение
int wvsprintf( LPTSTR lpOutput,
LPCTSTR lpFmt,
va_list arglist
);
А тут третий параметр типа va_list - себе ума не приложу как прикрутить

Добавлено через 3 минуты
Read formatted data from a string. More secure versions of these functions are available; see sscanf_s, _sscanf_s_l, swscanf_s, _swscanf_s_l.
А можно строчку-пример как из строки занести во float переменную - а то там что-то одни буферы - они явно не float. Если не затруднит, будьте любезны.
0
Модератор
Эксперт по электронике
8514 / 6329 / 857
Регистрация: 14.02.2011
Сообщений: 21,978
27.02.2011, 00:39 4
C++
1
2
3
char  tokenstring[] = "234.6";
float fp;
sscanf( tokenstring, "%f", &fp );
там их много sscanf с разными буквами для разных кодировок
тебе по моему проще убрать в настройках проекта использовать UNICODE
vs2008 2010 по умолчанию этот флаг выставляет
тогда все проблемы отпадут и будешь работать как в 6
или используй макрос _T _T("lalala")
но sscanf он помоему не канает
"%f\0"
а почему не "%f"
чтобы наверняка вставить конец строки.
не беспокойся он там будет (если буфера хватит)
я никогда не использовал такую запись потому и удивился
0
бжни
2473 / 1682 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
27.02.2011, 00:43 5
Цитата Сообщение от ValeryS Посмотреть сообщение
но sscanf он помоему не канает
_stscanf
1
Модератор
Эксперт по электронике
8514 / 6329 / 857
Регистрация: 14.02.2011
Сообщений: 21,978
27.02.2011, 00:43 6
попробуй так
C++
1
wsprintf(milage,_T("%f"),Machines[Machines.processing].Mileage);
0
анимешник++
95 / 62 / 7
Регистрация: 03.11.2009
Сообщений: 427
27.02.2011, 10:16  [ТС] 7
Цитата Сообщение от ValeryS Посмотреть сообщение
попробуй так
C++
1
wsprintf(milage,_T("%f"),Machines[Machines.processing].Mileage);
Неа, не работает.
В общем пока проблема не решена. Пока я не могу вывести число - ничего не могу сказать об _stscanf
0
374 / 321 / 32
Регистрация: 24.02.2011
Сообщений: 1,512
Записей в блоге: 1
27.02.2011, 15:44 8
Полагаю wsprintf не поддерживает тип %f, во всяком случае в MSDN для именно этой функции он не упоминается среди прочих.
Используйте swprintf. Обратная конвертация _wtof.
В обоих случаях существуют и другие варианты

Добавлено через 13 минут
#include <windows.h>
#include <iostream>

C++
1
2
3
4
5
6
7
8
9
10
11
12
int main()
{
    wchar_t milage[50];
    swprintf(milage, 50, L"%f", 122.2);
    float f = (float)_wtof(milage);
 
    std::wcout << milage << std::endl;
    std::wcout << f << std::endl;
 
    system("PAUSE");
    return 0;
}
1
бжни
2473 / 1682 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
27.02.2011, 15:46 9
использовать wstringstream
0
анимешник++
95 / 62 / 7
Регистрация: 03.11.2009
Сообщений: 427
27.02.2011, 20:50  [ТС] 10
Цитата Сообщение от bigredcat Посмотреть сообщение
Полагаю wsprintf не поддерживает тип %f, во всяком случае в MSDN для именно этой функции он не упоминается среди прочих.
Используйте swprintf. Обратная конвертация _wtof.
В обоих случаях существуют и другие варианты

Добавлено через 13 минут
#include <windows.h>
#include <iostream>

C++
1
2
3
4
5
6
7
8
9
10
11
12
int main()
{
    wchar_t milage[50];
    swprintf(milage, 50, L"%f", 122.2);
    float f = (float)_wtof(milage);
 
    std::wcout << milage << std::endl;
    std::wcout << f << std::endl;
 
    system("PAUSE");
    return 0;
}
Похоже, Вы не читали, что выдает мне по поводу swprintf ↑ на пару постов. + мне нужно не wchar_t а TCHAR. На счет _wtof пока ничего сказать не могу.

alex_x_x
Я так понял, это не функция, а строковый тип?
C++
1
typedef basic_stringstream<wchar_t, char_traits<wchar_t>,allocator<wchar_t> > wstringstream;
А он дружит с ws/swprinf и editbox`ами?
0
374 / 321 / 32
Регистрация: 24.02.2011
Сообщений: 1,512
Записей в блоге: 1
28.02.2011, 08:17 11
Цитата Сообщение от Iworb Посмотреть сообщение
Похоже, Вы не читали, что выдает мне по поводу swprintf ↑ на пару постов. + мне нужно не wchar_t а TCHAR. На счет _wtof пока ничего сказать не могу.
Если вы хотите использовать TCHAR, то что мешает вместо swprintf и _wtof использовать _stprintf и _tstof. Вам указали какие функции использовать, откройте справочник прочитайте об этих функциях, посмотрите в заголовочных файлах, что такое TCHAR.

Добавлено через 1 час 53 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <windows.h>
#include <tchar.h>
#include <iostream>
 
#ifdef UNICODE
#define tcout std::wcout
#else
#define tcout std::cout
#endif
 
int main()
{
    TCHAR s[50];
    _stprintf(s, TEXT("%f"), 122.2);
    float f = (float)_tstof(s);
 
    tcout << s << std::endl;
    tcout << f << std::endl;
 
    system("PAUSE");
    return 0;
}
Все работает с TCHAR
3
анимешник++
95 / 62 / 7
Регистрация: 03.11.2009
Сообщений: 427
28.02.2011, 10:23  [ТС] 12
Цитата Сообщение от bigredcat Посмотреть сообщение
Если вы хотите использовать TCHAR, то что мешает вместо swprintf и _wtof использовать _stprintf и _tstof. Вам указали какие функции использовать, откройте справочник прочитайте об этих функциях, посмотрите в заголовочных файлах, что такое TCHAR.

Добавлено через 1 час 53 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <windows.h>
#include <tchar.h>
#include <iostream>
 
#ifdef UNICODE
#define tcout std::wcout
#else
#define tcout std::cout
#endif
 
int main()
{
    TCHAR s[50];
    _stprintf(s, TEXT("%f"), 122.2);
    float f = (float)_tstof(s);
 
    tcout << s << std::endl;
    tcout << f << std::endl;
 
    system("PAUSE");
    return 0;
}
Все работает с TCHAR
За это спасибо, работает вывод в строку неплохо, а вот считывание немножко бажит:
к примеру пишу в editbox 163.27 , а он преобразует в 163.270004. А т.к. на editbox`ах у меня стоит ограничение по символам, программа крашится. Попробую найти какой-нибудь форматированный вывод.

Добавлено через 3 минуты
UPD: всё, всем спасибо. Тема закрыта.
0
бжни
2473 / 1682 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
28.02.2011, 14:53 13
%5.3f чем не устраивает?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.02.2011, 14:53

Хитрая лисица, или дружба по расчету?
Охраняю очень секретный обьект, территория большая, снега а этом году выпало много да и морозы под...

опять ошибка.на этот раз cannot convert `float (*)(float)' to `float' in argument passing
#include&lt;stdio.h&gt; #include&lt;stdlib.h&gt; #include&lt;math.h&gt; float f1(float x)/*vira*enie 1*/ ...

Не понимает Dictionary<string, (float[][] train, float[][] valid, float[][] test)> DataSet;
Доброго времени суток. Пытаюсь запустить пример по работе с библиотекой. Не понимает конструкцию ...

При вводе элементов массива выводить их тип (или int или float)
Помогите с ошибкой, и если не сложно то с заданием а то я вроде сделал только не могу проверить так...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.