Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.06.2011, 13:35   #1
malor
Форумчанин
 
Регистрация: 23.05.2007
Сообщений: 151
Вопрос Преобразование функцией _wtoi(): не все символы достались целому числу

Первая строка у меня в файле сейчас "309".
Код:
FILE *pFile;
wchar_t line[16];
int ID_msg = 0;    
int WMMsg;            
    
if (!VolumeFile(pathEventMouse)) return false;

pFile = fopen(pathEventMouse, "r");
if (!pFile) return false;
    
fgetws(line, sizeof(line), pFile); 

ID_msg = _wtoi(line);
В ID_msg попадает значение 3 вместо 309.
Почему 09 упущено функцией _wtoi() ?

В архиве скрин значения переменной line в отладке VS2008.
Вложения
Тип файла: zip Screen_Notepad_and_VSdebug_value_of_line.zip (62.6 Кб, 11 просмотров)
malor вне форума Ответить с цитированием
Старый 26.06.2011, 13:52   #2
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

_wfopen

Файл должен быть в кодировке utf16, либо делайте преобразование MultiByteToWideChar
Carbon вне форума Ответить с цитированием
Старый 26.06.2011, 18:18   #3
malor
Форумчанин
 
Регистрация: 23.05.2007
Сообщений: 151
Вопрос Использование _wfopen

Задействовал _wfopen():
Код:
FILE *pFile;
const wchar_t* pathEventMouse = L"Z:\\EventMouse.txt";	
wchar_t line[16];
int ID_msg = 0;		
int WMMsg;			
	
pFile = _wfopen(pathEventMouse, L"r");
if (!pFile) return false;

fgetws(line, sizeof(line), pFile); 
ID_msg = _wtoi(line);
Но все равно переменная ID_msg равна 3.
malor вне форума Ответить с цитированием
Старый 26.06.2011, 20:02   #4
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

_wfopen совершенно не причем, раз уж как-то хендл файла получен.
Я так понимаю, Carbon просто указал на ошибку стилистики.
Сам прекрасно видишь, что каждый символ оканчивается 0, что означает конец строки. Тебя удивляет, что в lister символы слитно? Но там конец строки определяется символом "возврат каретки" (13).
Расскажи, как пишешь в файл.
ЗЫ. И кстати в lister/Вид/только текст поставь - разрывы увидишь.

Последний раз редактировалось EUGY; 26.06.2011 в 20:11.
EUGY вне форума Ответить с цитированием
Старый 26.06.2011, 21:36   #5
malor
Форумчанин
 
Регистрация: 23.05.2007
Сообщений: 151
Вопрос

EUGY>>Расскажи, как пишешь в файл.

Храню только числа в файле. Сам текстовик был создан функцией WriteFile()Delphi XE), она записала его в Unicode. Отсюда и проблема возникла.
До этого я использовал в Delphi XE такой метод:
Цитата:
Rewrite(fEventKB);
WriteLn(fEventKB, ID_msg_KB);
Но понадобилось, чтобы текстовик время от времени считывала другая программа, и тогда чтоб установить опцию FILE_SHARE_READ я начал использовать WriteFile(). Тут и нарисовался Unicode
Как лучше поступить?
malor вне форума Ответить с цитированием
Старый 26.06.2011, 22:25   #6
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Что посоветовать..
Конвертим к ANSII, пропуская четный wchar_t
Код:
char* lineClear = new char[sizeof(line)/2];
for (int i = 0; i<sizeof(line)/2;i++ )
	lineClear[i] = line[i*2];
ID_msg = atoi(lineClear);
delete [] lineClear;
У тебя ведь только цифры?

Последний раз редактировалось EUGY; 26.06.2011 в 22:29.
EUGY вне форума Ответить с цитированием
Старый 27.06.2011, 12:01   #7
malor
Форумчанин
 
Регистрация: 23.05.2007
Сообщений: 151
Вопрос lineClear = new char[sizeof(line)/2];

Внутри функции показывает в отладчике, что sizeof(line) равно 4. Почему?
Содержимое line:
"\x33\x00\x30\x00\x39\x00\x0D\x00\x 0A\x00" (число 309)
Код:
void TransformLine(wchar_t* line, char *lineClear)
{
	for (int i = 0; i < sizeof(line)/2; i++ )
		lineClear[i] = line[i*2];
	
}

// Получение данных о событиях мыши из файла
bool getMouseParam(UINT8 &keyFlag, int &coordX, int &coordY)
{
	FILE *pFile;
        wchar_t line[16];
	int ID_msg = 0;		
	int WMMsg;			
	char *lineClear = "";

	pFile = fopen(pathEventMouse, "r");
	if (!pFile) return false;
	
	fgetws(line, sizeof(line), pFile); 

	lineClear = new char[sizeof(line)/2];
	TransformLine(line, lineClear);

	ID_msg = atoi(lineClear);
	delete [] lineClear;
        ........... etc ...............
}

Последний раз редактировалось malor; 27.06.2011 в 12:06.
malor вне форума Ответить с цитированием
Старый 27.06.2011, 15:04   #8
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

sizeof(line) равно 4. Это длина переменной указателя. Длину массива придется передавать отдельным параметром.

Последний раз редактировалось EUGY; 27.06.2011 в 15:39.
EUGY вне форума Ответить с цитированием
Старый 27.06.2011, 15:53   #9
An1ka
C++,DirectX/OpenGL
Форумчанин
 
Регистрация: 09.01.2011
Сообщений: 422
По умолчанию

Цитата:
Сообщение от malor Посмотреть сообщение
Внутри функции показывает в отладчике, что sizeof(line) равно 4. Почему?
Должно правильно показываться !
В крайнем случаи можно так:
Код:
wchar_t line[16];
sizeof(wchar_t)*16
An1ka вне форума Ответить с цитированием
Старый 27.06.2011, 16:12   #10
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Цитата:
Должно правильно показываться !
С какой стати вместо длины указателя будет длина массива.
Передача и длины массива и указателя на массив в функцию это обычная практика.
EUGY вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Delphi перебрать все символы из Edit AdDa Помощь студентам 2 06.06.2011 09:19
определить все двузначные числа сумма квадратов цифр которых кратна числу 15 [Pascal] mrRastom Помощь студентам 5 16.12.2010 09:47
Найти в массиве число наиболее близокое к целому числу Willow Помощь студентам 2 16.01.2010 13:33
Удалить из строки все символы типа #10 #9 и т.д. TwiX Общие вопросы Delphi 10 01.12.2009 19:21
удалить в строке все одинаковые символы Михаил70 Помощь студентам 5 09.09.2009 18:35