Запись данных в файл

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Алексей К.
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 419
Зарегистрирован: 12.05.2004 (Ср) 9:41
Откуда: Ульяновск

Запись данных в файл

Сообщение Алексей К. » 24.05.2004 (Пн) 11:09

У меня такая проблема:
Есть массив
а(1)=200
а(2)=234.234234
а(3)="ппппппп"
и т.д.
Когда я его записываю в файл output.txt.
То перед числами появляется пробел и после них. А перед символьными выражениями нет. Когда же я считываю их из файла через line input(мне только так надо) то они уже как string идут - а мне надо с ними арифмет. операции делать. Ругается несовпадением типов.
Как быть? Как от них избавится. А писать обработчик на удаление пробелов в начале и в конце не охота. Должно наверно быть более рационально решение. Помогите пожалуйста.

soljen
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 69
Зарегистрирован: 06.05.2004 (Чт) 15:47
Откуда: Из темноты...

Сообщение soljen » 24.05.2004 (Пн) 11:14

Привет!

Пробелы попробуй каким-нить Trim'ом рубануть!

А по поводу перевода воспользуйся стандартными CDbl, CInt...

Там много всего хорошего есть, что бы смоголо тебе помочь!!
Тиха украинская ночь, но сало надо перепрятать...
(R)Jeka

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 24.05.2004 (Пн) 11:15

Более рациональное решение, конечно же, есть. Функция Trim() - рекомендовано Microsoft :D .

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Сообщение Sirik » 24.05.2004 (Пн) 11:23

Записываешь данные через Cstr. Просто когда делаешь Str перед переменной ставиться пробел.
А чтобы делать ареф. операци переводи строки в числа, т.е. Val
Состояний же любви — десять: любовный взгляд, привязанность в мыслях, рождение желания, бессонница, исхудание, отвращение к предметам восприятия, утрата стыда, безумие, потеря сознания и смерть — вот их признаки

codemaster
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 604
Зарегистрирован: 13.02.2004 (Пт) 13:35

Re: Запись данных в файл

Сообщение codemaster » 24.05.2004 (Пн) 11:26

Алексей К. писал(а):У меня такая проблема:
Есть массив
а(1)=200
а(2)=234.234234
а(3)="ппппппп"
и т.д.
Когда я его записываю в файл output.txt.
То перед числами появляется пробел и после них. А перед символьными выражениями нет. Когда же я считываю их из файла через line input(мне только так надо) то они уже как string идут - а мне надо с ними арифмет. операции делать. Ругается несовпадением типов..


Ну очень странный у тебя массив.
особенно если помотреть математически ..............

Алексей К. писал(а):А писать обработчик на удаление пробелов в начале и в конце не охота. Должно наверно быть более рационально решение. Помогите пожалуйста.
писать ничего не надо
лучше почитать книгу по vb там наверняка есть инфа по TRIM$ и по объявлению массивов

Шурик
Самогонщик
Самогонщик
Аватара пользователя
 
Сообщения: 1657
Зарегистрирован: 30.06.2003 (Пн) 13:27
Откуда: из запоя :))))) Матных сообщений: 972

Сообщение Шурик » 24.05.2004 (Пн) 11:32

Есть еще вариант с пробелами, правда не совсем скажем так хороший, но его тоже можно использовать MID$.

Алексей К.
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 419
Зарегистрирован: 12.05.2004 (Ср) 9:41
Откуда: Ульяновск

Сообщение Алексей К. » 24.05.2004 (Пн) 11:35

Всем спасибо за столь оперативную помощь. :D С Val все работает как надо.

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 24.05.2004 (Пн) 11:42

Смотри, аккуратнее с этим Val'ом - она, насколько я помню, как-то своеобразно обрабатывает разделитель дробной части. На запятой может считать, что это уже другое число :( - у нас такое было.

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Сообщение Sirik » 24.05.2004 (Пн) 12:06

Ennor писал(а):Смотри, аккуратнее с этим Val'ом - она, насколько я помню, как-то своеобразно обрабатывает разделитель дробной части. На запятой может считать, что это уже другое число :( - у нас такое было.

Это произойдёт только тогда когда у тебя разделитель дробной части числа есть точка. Тогда оператор VAL не поймёт запятую. А может быть и тогда когда у тебя число емеет тип Integer или Long... вобщем оно должно быть Currency
Состояний же любви — десять: любовный взгляд, привязанность в мыслях, рождение желания, бессонница, исхудание, отвращение к предметам восприятия, утрата стыда, безумие, потеря сознания и смерть — вот их признаки

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 24.05.2004 (Пн) 12:31

К сожалению, когда у тебя число сидит в переменной типа String, то Val() понятия не имеет, Long оно или же все-таки Double. Нам пришлось в свое время перед каждым обращением к Val() делать так:
Код: Выделить всё
DblVar = Val(Replace(strVar, ",", ".", 1, 1))

Тут просто еще всплывает проблема непредсказуемости национальных настроек на компьютере пользователя. :(

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 24.05.2004 (Пн) 12:54

Если используется пара CStr/CSng(CDbl,CCur), то в обоих случаях используются именно национальные настройки. Т.е. CSng всегда поймет то, что было создано при CStr. А Str/Val всегда использует фиксированные настройки (без ведущего нуля, разделитель целой и дробной - точка, разделителя групп нет).
Lasciate ogni speranza, voi ch'entrate.

Faust
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 649
Зарегистрирован: 29.12.2003 (Пн) 13:38
Откуда: лаборатория

Сообщение Faust » 24.05.2004 (Пн) 16:57

Sirik писал(а):Записываешь данные через Cstr. Просто когда делаешь Str перед переменной ставиться пробел.

Это когда значение переменной положительное, а когда отрицательное - на этом месте стоит минус. А интересно - Cstr имеет преимущество в скорости перед Format$'ом?
Листинги не горят!

Faust
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 649
Зарегистрирован: 29.12.2003 (Пн) 13:38
Откуда: лаборатория

Сообщение Faust » 24.05.2004 (Пн) 17:04

Sirik писал(а):Записываешь данные через Cstr. Просто когда делаешь Str перед переменной ставиться пробел.

Не всегда - это место просто зарезервировано для минуса перед отрицательными числами. А интересно - использование Cstr дает преимущество в чем-то по сравнению с Format$'ом ?
Листинги не горят!

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 24.05.2004 (Пн) 19:34

Faust писал(а):...
А интересно - использование Cstr дает преимущество в чем-то по сравнению с Format$'ом ?

Естественно. Format() - функция универсальная, и потому очень медленная. Сколько там наворочено на тему преобразования даты/времени, я вообще молчу. А CStr() - всего лишь конвертация в строку по строго определенному формату, а не по произвольному, в отличие от первого случая.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 25.05.2004 (Вт) 9:12

Эти функции могут пригодится
Код: Выделить всё
Function Num2Str(ByVal Value As Variant, Optional ByVal ValueType As VbVarType = -1) As String
On Error Resume Next
If ValueType < 0 Then ValueType = VarType(Value)
Select Case ValueType
  Case VbVarType.vbNull, VbVarType.vbEmpty
  Case VbVarType.vbError
  Case VbVarType.vbVariant
    Num2Str = CStr(Value)
  Case VbVarType.vbBoolean
    Num2Str = IIf(Value, "True", "False")
  Case VbVarType.vbByte
    Num2Str = Trim$(Str$(Fix(Value)))
  Case VbVarType.vbInteger, VbVarType.vbLong
    Num2Str = Trim$(Str$(Fix(Value)))
  Case VbVarType.vbDecimal
    Num2Str = Format$(Value, "0.00")
  Case VbVarType.vbSingle, VbVarType.vbDouble
    Num2Str = Format$(Value, "0.0#########")
  Case VbVarType.vbCurrency
    Num2Str = Format$(Value, "#,0.00 ")
  Case VbVarType.vbString
    Num2Str = Value
End Select
On Error GoTo 0
End Function

Function Str2Lng(ByVal Value As String) As Long
On Error Resume Next
Str2Lng = CLng(Value)
On Error GoTo 0
End Function

Function Str2Dbl(ByVal Value As String) As Double
On Error Resume Next
Str2Dbl = CDbl(Value)
On Error GoTo 0
End Function

Function Str2Cur(ByVal Value As String) As Currency
On Error Resume Next
Str2Cur = CCur(Value)
On Error GoTo 0
End Function
Lasciate ogni speranza, voi ch'entrate.

_Vasya
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 28.02.2004 (Сб) 21:21

Сообщение _Vasya » 25.05.2004 (Вт) 15:27

Самое разумное решение создать требуемый пользовательський тип и записовать в типизированый файл, тогда не надо ничего преобразовать.


Или можешь использовать ф-ю Join(SourceArray[,Delimiter]) и записовать уже строку :)
Вот её описание:
Новая функция,которая появилась в Visual Basic 6.0
Функция служит для слияния всех элементов заданного массива в одну строку со вставкой между ними необязательного разделителя

Возвращаемое значение
Возвращает строку, созданную путем объединения множества подстрок, содержащихся в массиве с разделителем между ними

Параметры
--------------------------------------------------------------------------------
SourceArray Обязательный аргумент - одномерный массив, содержащий объединяемые подстроки
Delimiter Необязательный аргумент - символ, используемый для разграничения подстрок в возвращаемой строке. Если параметр опущен, применяется символ пробела (" "). В том случае, когда аргумент является строкой нулевой длины (""), производится конкатенация всех элементов списка без добавления разделителей

Код: Выделить всё
' Соединяем два слова
Dim vArr(1 to 2)
Dim retval as String
vArr(1)="Русский"
vArr(2)="Проект"
retval=Join(vArr,"_")
Print retval

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 25.05.2004 (Вт) 16:19

Вообще-то решение с пользовательским типом сброшенным в бинарный файл наиболее оптимальное - все операции с ним максимально простые и в то-же время он может иметь достаточно сложную структуру с полями содержащими массивы других пользовательских типов, к примеру...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Tamahawk
Обычный пользователь
Обычный пользователь
 
Сообщения: 78
Зарегистрирован: 03.02.2004 (Вт) 22:11

Сообщение Tamahawk » 28.05.2004 (Пт) 17:17

Слухай весь твой массив можно загнать в файл без каких либо проблем
сделай так:
a(1) as integer или long
и отрывай файл типа не for Input a for Random и ты сможеш получать все типы абсолютно точно без каких либо line input а GET #1 -ом
попробуй так


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Bing-бот, Google-бот, Yandex-бот и гости: 0

    TopList  
cron