Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Type mismatch или можно попроще? Несовпадение типов 
V
    Опции темы
neiron
Дата 19.4.2006, 01:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 18.4.2006
Где: Краснодар

Репутация: 3
Всего: 4



снова я...
В общем, программка моя создаёт некий файл последовательного доступа - одна строка - одно число. 
Записи создаются через Print. Записи превращаются в текст.
Т.е. когда я эти самые данные пытаюсь вытащить через:
Код

Line Input #4, GenKolIt

где GenKolIt числового типа, мне выдаётся ошибка о несовпадении.

Выход-то я нашёл, но корявый как мне кажется... создал новую строковую, и сначала записываю в неё, а уж потом перевожу:
Код

Line Input #4, strArh
KolObuch = CInt(strArh)
Line Input #4, strArh
GenKolIt=CInt(strArh)

и т.д.
Неудобности две - в два раза больше кода, что собственно не самое главное. Главное то, что сначала необходимо посмотреть какого типа переменная, а потом уже писать перевод - то ли CInt, то ли Cbyte, то ли CDbl... 

В общем, суть вопроса:
есть ли способ 
а) сохранять данные не в текстовом, а числовом виде?
б) читать текстовые данные в переменные напрямую?
 
PM MAIL   Вверх
SW1
Дата 19.4.2006, 04:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 17.4.2006

Репутация: нет
Всего: нет



эту проблему тебе не обойти т.к. функция input возращает всегда текстовый тип файлов а если тебе не нравится все записывать дважды и у тебя много данных сделай вспомогательную функцию. В принципе могу сей час ошибиться:
Код

Function GetNumber (NumberFile as byte, Types as byte) as variant
dim TmpStr as string
input #NumberFile , TmpStr
 'предполагается что у тебя 3 типа данных
select case Types 
case 1
GetNumber  = CInt (TmpStr )
case 2
GetNumber  = Cbyte(TmpStr )
case 2
GetNumber  = CDbl(TmpStr )
end select
end function

'А это вызов функции
'----------------------------
GenKolIt = GetNumber  (1,1)
'----------------------------


могут возникнуть проблемы так как не проверял

Ответ на вопрос 
Цитата

сохранять данные не в текстовом, а числовом виде?

файл на то и называется текстовым что в него можно сохранять только текст

а на второй вопрос кажется ответил  

Это сообщение отредактировал(а) SW1 - 19.4.2006, 04:57
PM MAIL   Вверх
Akina
Дата 19.4.2006, 09:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 34
Всего: 454



а) нет - при переходе от QB к VB функции CVx/MKx умерли. Однако ты не гоняйся за байтами - конвертируй все в Long.
б) sStr = Input(NumOfBytes,#FileNumber) - или InputB.

Цитата(neiron @  19.4.2006,  02:40 Найти цитируемый пост)
когда я эти самые данные пытаюсь вытащить через:
Код
Line Input #4, GenKolIt

где GenKolIt числового типа, мне выдаётся ошибка о несовпадении.

а какого ты Line Input используешь??? он всегда возвращает строку - это даже из названия ясно... используй просто Input.  


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
neiron
Дата 19.4.2006, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 18.4.2006
Где: Краснодар

Репутация: 3
Всего: 4



спасибо ещё раз ;)

Akina, если использовать Input, то будут читаться и разделители (запятые), а т.к. в файле и double и long хранятся, то при считывании строки 
1234,5678
(одно число)
данные будут заноситься в две переменные.
Line Input считывает всю строку полностью и воспринимает как единое число...
Т.е. Line Input используется после Print,
а Input после Write.
 
PM MAIL   Вверх
Akina
Дата 19.4.2006, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 34
Всего: 454



Цитата(neiron @  19.4.2006,  14:46 Найти цитируемый пост)
Line Input считывает всю строку полностью и воспринимает как единое число...

Вернемся к первоисточнику:
Цитата(MSDN)

Line Input # Statement

Reads a single line from an open sequential file and assigns it to a String variable.

Syntax

Line Input #filenumber, varname

Part Description 
filenumber. Any valid file number. 
varname/ Valid Variant or String variable name. 

Ну и где там "как единое число"?

Цитата(neiron @  19.4.2006,  14:46 Найти цитируемый пост)
Line Input используется после Print, а Input после Write.

Аналогично:
Цитата(MSDN)

Data read with Line Input # is usually written from a file with Print #.

Цитата(MSDN)

Data read with Input # is usually written to a file with Write #. 

Не догма, аднака...  


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
neiron
Дата 19.4.2006, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 18.4.2006
Где: Краснодар

Репутация: 3
Всего: 4



Скорее всего, эт я не так выразился ;)
Тут скорее нужно говорить не "воспринимает как одно число", а "читает без разделителей".
Т.е. если Input обращает внимание на запятые, то LineInput нет. 
А "единое число" не воспринимается, а выводится из текстовой переменной, в которую данные считываются.

А насчёт второго... ну естественно... никакой ошибки не будет... просто если записываешь через один оператор, то для корректного считывания использовать соответствующий оператор.
Например, в строку файла заносишь какое-либо число дробное десятичное (заносишь через Print). И тебе нужно узнать его целую или дробную часть. Разумнее не считывать через Line, а затем вычислять остаток - уйдёт 4 оператора, а просто использовать Input - тогда две строчки - input# и cint#. Но если тебе нужно именно число целиком, то проще читать через Line Input...

Да, тут ещё вопросик появился...
Есть ли возможность в VB сохранять числа в файле с разделителем целой/дробной части не в виде запятой, а в виде точки? Как понимаю, можно функцию небольшую написать, преобразующую дробное число в такой текстовый формат(разделение, а потом конкантенация с точкой)... а встроенное что-нибудь есть? 
PM MAIL   Вверх
cardinal
Дата 19.4.2006, 23:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 19
Всего: 99



Посмотри функции Format или там Replace... 


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
neiron
Дата 20.4.2006, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 18.4.2006
Где: Краснодар

Репутация: 3
Всего: 4



спасибо, raplace подошёл. 
Я это к чему спрашивал: 
Если разделителем целой/дробной ставить не запятую, а точку, то тогда можно использовать Input, причём обходясь без строковой. Честно, не разбирался почему, но работает...
Т.е. если у меня есть файл:
123.456
234.567
456.789
то 
Код

Input #1, dblA

будет работать, даже если dblA не строковая, а числовая... smile  
PM MAIL   Вверх
Akina
Дата 20.4.2006, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 34
Всего: 454



Цитата(neiron @  20.4.2006,  14:59 Найти цитируемый пост)
будет работать, даже если dblA не строковая, а числовая... 

Это называется "неявное приведение типа" и страшно не рекомендуется - вот именно из-за проблем, схожих с проблемой "точка/запятая". 


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "VB6"
Akina

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по VB обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • Используйте теги [code=vb][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Akina.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB6 | Следующая тема »


 




[ Время генерации скрипта: 0.0807 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.