Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB6 > Type mismatch или можно попроще?


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

Line Input #4, GenKolIt

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

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

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

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

В общем, суть вопроса:
есть ли способ 
а) сохранять данные не в текстовом, а числовом виде?
б) читать текстовые данные в переменные напрямую?
 

Автор: SW1 19.4.2006, 04:53
эту проблему тебе не обойти т.к. функция 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)
'----------------------------


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

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

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

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

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

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

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

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

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

Автор: neiron 19.4.2006, 13:46
спасибо ещё раз ;)

Akina, если использовать Input, то будут читаться и разделители (запятые), а т.к. в файле и double и long хранятся, то при считывании строки 
1234,5678
(одно число)
данные будут заноситься в две переменные.
Line Input считывает всю строку полностью и воспринимает как единое число...
Т.е. Line Input используется после Print,
а Input после Write.
 

Автор: Akina 19.4.2006, 14:36
Цитата(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 #. 

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

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

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

Да, тут ещё вопросик появился...
Есть ли возможность в VB сохранять числа в файле с разделителем целой/дробной части не в виде запятой, а в виде точки? Как понимаю, можно функцию небольшую написать, преобразующую дробное число в такой текстовый формат(разделение, а потом конкантенация с точкой)... а встроенное что-нибудь есть? 

Автор: cardinal 19.4.2006, 23:04
Посмотри функции Format или там Replace... 

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

Input #1, dblA

будет работать, даже если dblA не строковая, а числовая... smile  

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

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

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