Как открыть файл basic
Upgrade Wizard автоматически заменяет команды и вам нет нужды делать это самостоятельно, но необходимо помнить о всех возможностях при "ручной" миграции кода.
Никаких проблем с текстовыми файлами не возникает, поскольку функции VB.NET позволяют работать со строками при записи в файл также как и VB6. "Необычайно странно, что парни из Microsoft не накидали здесь "подводных" камней!", - скажете вы. Да, они очень о вас заботятся.
Двоичные файлы и файлы произвольного доступа
Еще больше удивления у вас, наверное, вызовет тот факт, что и с двоичными файлами ситуация обстоит также как и с текстовыми. Ага! Вы уже успели обрадоваться, что ж, здесь-то несколько "валунов" притоплено на вашем пути.
Прежде всего "старые новые" функции Get и Put, использовавшиеся для записи в двоичные файлы (Binary) и файлы произвольного доступа (Random) теперь называются FileGet и FilePut и ведут себя немного иначе. Когда вы записываете строки переменной длины или динамические массивы данных в файлы произвольного доступа, автоматически добавляется заголовок, определяющий длину, из двух байт.
Также, FileGet не определяет тип переданного массива во время выполнения, если массив не был инициализирован предварительно.
Сразу же рассмотрим примеры. Для "пущей наглядности" я определил специальную структуру. Вот что мы имеем для двоичного файла:
Для начала пример на VB6 :
Вы еще помните, о чем я писал, обсуждая поведение функции FileGet? Обычно в VB6 для чтения массива данных функции Get передается именно неинициализированный массив , как это и сделано в примере выше.
Теперь мы можем прочитать данные, но при этом легко заметить, что вместо ожидаемых пар значений i = myBinArray(i) мы видим i <> 0 (например, 0 = 0, 1=1, 2=22 и т.п. ). Вот это как раз и есть следствие того, что FileGet рассчитывает прочитать заголовок с указанием числа элементов в массиве. Достаточно указать, что необходимо считывать динамический массив, установив ArrayIsDynamic = True, как все наши проблемы снимаются.
Соответственно то же самое надо сделать и в FilePut.
Примечания
Для новичков в программировании я расскажу о разных типах файлов. Начнем с наиболее очевидного - текстовых. Текстовый файл содержит символы "пригодные" для чтения человеком, тот самый текст, который так легко и приятно редактировать. Файлы с исходными текстами и в VB6 и в VB .NET являются текстовыми (более того, открою вам секрет, даже исходные файлы C++ тоже текстовые , простите, не сдержался).
Текстовые файлы являются файлами последовательного доступа, то есть в них выполняется либо чтение информации, либо запись в файл (именно поэтому при открытии файла в Open . Close указывается Input или Output) . То есть, если файл открыт на запись, то из него ничего прочитать нельзя, если же он открыт на чтение, то ничего записать в него не получится, соответственно.
Двоичный файл ( Binary) содержит не только читаемые человеком символы, но и символы, имеющие смысл только для машины. Они предназначены для хранения нетекстовых данных (все, что не есть текстовый файл - есть двоичный файл).
Файл произвольного доступа ( Random) может содержать и текстовые и двоичные записи, этакую смесь. Вообще-то, это тоже двоичный файл, но у него есть одно отличие от "обычного" двоичного файла - запись в нем имеет определенную длину (то есть за каждый сеанс записи вы можете записать не более и не менее символов, чем заданная длина записи, если вы запишете меньше данных, остаток будет заполнен нулями автоматически).
Двоичные файлы и файлы произвольного доступа являются файлами именно произвольного доступа. (К сожалению здесь есть некоторая проблема с терминологией, но что есть, то есть). То есть, открыв файл ( Open) вы можете и писать и читать информацию из него, указывая позицию в файле из которой вы хотите читать /писать.
Схематично содержимое файлов разных типов можно представить так (х - любой символ, текстовый или двоичный):
Текстовый файл или двоичный файл
Файл произвольного доступа
Насколько мне известно, подавляющая часть программистов не могут объяснить, чем отличается поведение динамического массива, от статического массива (с жестко заданным размером - числом элементов). Пожалуй, сейчас как раз тот случай, когда необходимо прояснить этот момент.
Создадим два массива:
Теперь у нас есть один массив с 256 элементами и один формально "пустой массив", для заполнения которого нужно использовать ReDim.
В дальнейшем мы можем всегда переопределить размер динамического массива по нашему усмотрению используя ReDim и ReDim Preserve, но мы не можем переопределить размер статического массива. Хотя, казалось бы, у этих двух массивов много общего.
Private Sub btnSave_Click(…) Handles btnSave.Click Dim filename As String Dim i As Integer filename = InputBox("Введите имя файла", "Сохранить файл") 'окно для ввода FileOpen(1, filename, OpenMode.Output) ' открываем файл для записи For i = 0 To lst.Items.Count - 1 PrintLine(1, lst.Items(i)) 'записываем в файл i-ю строку списка Next FileClose(1) End Sub
- Событие Click кнопки btnOpen («Загрузить из файла») запрограммируйте таким образом, чтобы в список помещались все строки из файла:
Private Sub btnOpen_Click(…) Handles btnOpen.Click Dim filename, CurStr As String filename = InputBox("Введите имя файла", "Загрузить файл") 'окно для ввода FileOpen(1, filename, OpenMode.Input) 'открываем файл для чтения lst.Items.Clear() While Not EOF(1) CurStr = LineInput(1) 'считываем очередную строку If CurStr <> "" Then lst.Items.Add(CurStr) 'вносим строку в список End While FileClose(1) End Sub
- Запустите приложение, внесите в список lst несколько строк и попытайтесь сохранить их в виде файла (желательно с расширением .txt: например, proba.txt). Если не написан путь к файлу, то файл сохранится в папке /bin/Debug Вашего проекта.
II. Работа с типизированными файлами
В типизированных файлах можно прочитать любую по очереди запись. Добавить новую запись в конец файла.
Задание: Хранение картотеки одинаковых по структуре карточек. Необходимо создать возможность добавления карточки и просмотра карточки по ее номеру.
Выполнение:
Разделим форму условно на две части: в первой части создадим возможность добавления карточки в картотеку, а во второй – просмотр карточки по номеру (см. рисунок):
Форма «Работа с типизированными файлами»
- Разместите на форме два элемента управления GroupBox . Установите свойство Text первой группы равным Добавление в картотеку, а второй – Просмотр картотеки.
- В группу GroupBox1 добавьте 4 элемента Label и задайте их свойствам Text значения: Имя, Фамилия, Пол, Возраст.
- В ту же группу поместите 3 элемента TextBox. Их свойствам Text задайте пустые строки. А для свойств Name укажите: для первого элемента – FirstName, второго – LastName, третьего –Age.
- Добавьте в первую группу два объекта RadioButton. Для их свойств Name укажите: для первого элемента Male, для второго –Female. Свойство Text для первого укажите – мужской, для второго – женский.
- Расположите в группе одну кнопку (button) со свойством Name равным AddButton и свойством Text равным Добавить.
- Во второй группе разместите 7 элементов типа Label и пять текстовых полей, задайте значения их свойств в соответствии с Таблицей 12:
Пояснение: чтобы дополнить некоторую строку S до длины N используется выражение: S+Space(N-Len(S)). Функция Space(K) возвращает строку, состоящую из К пробелов.
Суммарная длина записи равна 38 (15 на имя + 15 на фамилию + 1 на пол +3 на возраст)
FilePutObject(1, card, 1 + LOF(1) / 38): LOF возвращает длину файла; разделив полученное значение на размер записи (38 байт), получаем количество записей; новая запись будет иметь номер, на единицу больший.
- Теперь осталось запрограммировать кнопку Showbutton («Показать»):
Private Sub showButton_Click(…) Handles showButton.Click Dim card As String = "" FileOpen(1, "cardfile.dat", OpenMode.Random, , , 38) FileGetObject(1, card, Val(txtcardNumber.Text)) FileClose(1) txtFirstNAme.Text = Mid(card, 1, 15) txtLastName.Text = Mid(card, 16, 15) If Mid(card, 31, 1) = "м" Then txtGender.Text = "мужской" Else : txtGender.Text = "женский" End If txtAge.Text = Mid(card, 32, 3) End Sub
III. Работа с нетипизированными файлами
Нетипизированные файлы – файлы, не имеющие четкую структуру.
Задание: Перепишите программу для работы с картотекой с использованием нетипизированных файлов.
Специфические особенности каждого из файлов рассмотрим на приведенных ниже примерах. На основе листингов создайте Windows приложения, запустите программы и ответьте на контрольные вопросы.
Ниже приведен код программы, обеспечивающей заполнение файла a1.bin значениями массива целых чисел (от 1 до 10, каждое в 4 степени), а затем считывание данных из этого файла в файл a2.bin.
В программе указываются 2 имени файла:
Если открыть образовавшиеся файлы для просмотра в шестнадцатеричном представлении ( в Windows Commander клавишей F3, затем кнопки меню Options>Hex), то увидим следующее:
На каждое из вводимых в файл чисел отводится по 4 байта, поскольку тип переменных Integer. Байты заполняются, начиная слева направо. Используя калькулятор можно сопоставить шестнадцатеричные числа из файла с их десятеричными эквивалентами. Например, последние 4 байта (10 27 00 00), если их записать в HEX представлении как 2710, то в десятеричном представлении (Dec) это будет соответствовать 10000, (10 в 4 степени).
Пример обработки нетипизированного файла см. ссылку (Загрузка и чтение BMP на VB)
Контрольные вопросы:
Ниже приведен код программы, обеспечивающей заполнение текстового файла a.txt несколькими строками. Затем файл закрывается и открывается в режиме чтения. Вместе с этим создается новый файл b.txt и в него копируются все строки из файла a.txt.
В файл b.txt записывается следующая информация
Контрольные вопросы:
- Сформулируйте одним предложением, что делает программа.
- Сколько байт выделяется под переменную типа String?
- Сколько байт выделяется под один символ?
- Найдите в HEX-листинге и определите назначение кодов (D1, E7, 20, oD, 0A)
- Чем отличаются режимы OpenMode.Output, OpenMode.Input, OpenMode.Append?
- В чем различие функций PrintLine и Print? Опишите параметры этих функций?
- Какой результат возвращает функция LOF(FNum1) и в каких единицах измерения?
Информация в типизированных файлах хранится в виде набора одинаковой структуры. Размер одной записи есть значением суммы размеров всех её полей.
Для того, чтобы открыть файл записей, необходимо воспользоваться оператором Open, аналогично рассмотренным ранее типам файлов. Однако, его формат в этом случае несколько отличается от предыдущих, так как необходимо указывать размер записей, которые содержатся в файле.
Ниже приведен код программы, обеспечивающей описание структуры для записи Session. После этого создается файл записей a.dat и в него заносятся две одинаковые записи типа Session при помощи переменной rec1. Затем вторая запись извлекается из файла в переменную rec2, после чего в ней изменяются значения полей Name, Number и Progr. Отредактированная запись вновь заносится в файл a.dat.
Ознакомьтесь с результатами, представленными в образовавшемся файле a.dat.
Первые два байта (14 00) определяют длину строковой переменной (в Dec-коде 20 символов). После символов следует описание значений других переменных, определенных в структуре Session. Раскодируйте самостоятельно оставшуюся информацию. При этом воспользуйтесь калькулятором для перевода Hex-кода в Dec-код.
Контрольные вопросы:
- Сформулируйте одним предложением, что делает программа.
- Сколько байт выделяется под значения полей Name, Number и Progr ? Найдите эти значения в HEX-листинге для записей rec1 и rec2.
- Опишите параметры функции FileOpen.
- В HEX-листинге перед начало 2-й записи пустой байт (0о). Как изменить код, чтобы пустого байта не было?
- Опишите параметры функции FilePut и FileGet.
- Как экономнее записать число 123456– как целое число или как текстовая переменная?
Теперь, когда мы разобрались с теорией, можно применить знания на практике. Напишем простейшую программу, которая иллюстрирует обычное применение типизированного файла – хранение картотеки, состоящей из одинаковых по своей структуре карточек. Ограничимся пока лишь двумя функциями:
- добавление новой карточки в картотеку;
- просмотр любой карточки по введенному номеру.
Рисунок демонстрирует возможности нашей картотеки.
Выберите команду File > New > Project.
- В ту же самую группу поместите три элемента типа TextBox. В качестве значения свойства Text для каждого элемента укажите пустую строку. Значением свойства Name первого элемента установите строку FirstName, второго – LastName; третьего – Age.
- Добавьте в первую группу элементов два объекта RadioButton. Установите их свойства в соответствии с таблицей.
- Расположите в группе одну кнопку типа Button. Установите для свойства Name значение AddButton, а для свойства Text значение Добавить.
- Теперь добавим элементы во вторую группу (GroupBox2). Разместите в ней восемь элементов типа Label и задайте их свойства в соответствии с таблицей.
- Добавьте во вторую группу элемент типа TextBox. Установите в качестве значения его свойства Name строку CardNumber, а в качестве значения свойства Text — пустую строку.
- Поместите в группу кнопку типа Button. Установите для свойства Name значение ShowButton, а для свойства Text значение Показать.
На этом разработка внешнего вида формы заканчивается:
Данные карточки можно хранить, например, в строковой переменной. Если выделить для имени и фамилии человека по 15 символов, для графы «пол» – 1 символ («м» или «ж»), а для возраста 3 символа, то карточка будет представлена в виде строки из 34 символов
Недостающие символы при этом дополняются пробелами. Например, если в поле Имя введена строка Елена, нам придется добавить 10 пробелов, чтобы получить в сумме 15 символов. Теперь можно реализовать функцию добавления новой карточки в картотеку. Двойным щелчком левой кнопки мыши на кнопке AddButton откройте текст процедуры AddButton_Click(). В теле процедуры введите:
Чтобы дополнить некоторую строку S до длины N, мы использовали выражение
Функция LOF(filenumber) из строки
возвращает длину (в байтах) файла с номером filenumber. Разделив полученное значение на размер записи (38 байт), получаем количество записей. Новая же запись, естественно, будет иметь номер, на единицу больший, чем последняя запись картотеки.
После внесения 2-х записей в файл cardfile.dat будет помещена следующая информация:
Каждая запись начинается с 2-х байтов идентификатора (08 00) и длины строковой переменной (22 00). Далее следует описание символов этой переменной.
Нам осталось только реализовать функцию просмотра картотеки. Перейдите на форму приложения. Двойным щелчком левой кнопки мыши на кнопке ShowButton откройте процедуру ShowButton_Click(). В теле процедуры введите:
Функция Mid(string, i, length) возвращает подстроку строки string, начинающуюся с i-ro символа строки string и содержащую length символов. Таким образом, подстрока Mid(card, 1,15) представляет из себя значение поля Имя, подстрока Mid(card, 16,15) соответствует полю Фамилия, Mid(card, 31,1) – это пол, a Mid(card, 32,3) – возраст.
Как уже говорилось выше, типизированные файлы состоят из набора однотипных записей. Мы можем прочитать любую запись, изменить произвольную запись в файле или добавить новую запись в конец файла. Как вы уже знаете, прежде всего, файл нужно открыть при помощи процедуры FileOpen(). Для открытия типизированного файла в качестве режима работы (workmode) необходимо указать OpenMode.Random (и для чтения, и для записи). Кроме того, следует задать значение необязательного параметра RecordLength:
RecordLength — это размер записи в байтах, из которых состоит файл. При работе с типизированными файлами для чтения и записи данных используются процедуры FileGetObject() и FilePutObject. Их синтаксис выглядит так:
Процедура FileGetObject ( )считывает в переменную var запись с номером recnumber из входного файла filenumber (первая запись имеет номер 1, вторая – 2 и т. д.).
Процедура FilePutObject ( ), наоборот, записывает в файл значение переменной var. Если параметр recnumber не указан, то операция будет производиться с текущей записью (если мы работали с первой записью, то текущей будет вторая; если со второй, то третья и т. д.)
Заметьте, для каждого режима работы с файлом существуют свои процедуры и функции чтения/записи. Если попытаться, к примеру, прочесть данные из типизированного файла при помощи функции LineInput, то произойдет ошибка времени выполнения Bad file mode. Как и прежде, закрытие файла производится при помощи процедуры
На этом разработка приложения заканчивается.
Контрольные вопросы:
Наша картотека обладает одной особенностью: каждая карточка, хранимая в типизированном файле, занимает 38 байт независимо от реального размера. Такой способ хранения нельзя назвать экономным – в итоге существенная часть файла cardfile.dat может расходоваться впустую. Зато доступ к любой записи осуществляется очень быстро, поскольку все записи имеют одинаковый размер и компьютер может легко вычислить, в каком месте файла какая запись находится. Если же время доступа для нас не имеет большого значения, а место на диске расходовать понапрасну не хотелось бы, можно воспользоваться не типизированным файлом. При этом, однако, чтобы прочесть какую-либо запись, нам придется заодно прочесть все предшествующие записи.
Перепишем теперь программу работы с картотекой с использованием не типизированных файлов. Все интерфейсные элементы, конечно, останутся без изменений; необходимо лишь переписать две процедуры – AddButton_Click() и ShowButton_Click(). Измененные версии процедур представлены в листингах 1 и 2.
Программы, которые поддерживают BAS расширение файла
В следующем списке перечислены программы, совместимые с файлами BAS, которые разделены на категории 3 в зависимости от операционной системы, в которой они доступны. BAS файлы можно встретить на всех системных платформах, включая мобильные, но нет гарантии, что каждый из них будет должным образом поддерживать такие файлы.
Программы, обслуживающие файл BAS
Как открыть файл BAS?
Причин, по которым у вас возникают проблемы с открытием файлов BAS в данной системе, может быть несколько. С другой стороны, наиболее часто встречающиеся проблемы, связанные с файлами BASIC Source Code Format, не являются сложными. В большинстве случаев они могут быть решены быстро и эффективно без помощи специалиста. Ниже приведен список рекомендаций, которые помогут вам выявить и решить проблемы, связанные с файлами.
Шаг 1. Установите Microsoft Visual Studio программное обеспечение
Шаг 2. Убедитесь, что у вас установлена последняя версия Microsoft Visual Studio
Вы по-прежнему не можете получить доступ к файлам BAS, хотя Microsoft Visual Studio установлен в вашей системе? Убедитесь, что программное обеспечение обновлено. Иногда разработчики программного обеспечения вводят новые форматы вместо уже поддерживаемых вместе с новыми версиями своих приложений. Причиной того, что Microsoft Visual Studio не может обрабатывать файлы с BAS, может быть то, что программное обеспечение устарело. Самая последняя версия Microsoft Visual Studio обратно совместима и может работать с форматами файлов, поддерживаемыми более старыми версиями программного обеспечения.
Шаг 3. Назначьте Microsoft Visual Studio для BAS файлов
Если проблема не была решена на предыдущем шаге, вам следует связать BAS файлы с последней версией Microsoft Visual Studio, установленной на вашем устройстве. Метод довольно прост и мало меняется в разных операционных системах.
Изменить приложение по умолчанию в Windows
- Выберите пункт Открыть с помощью в меню «Файл», к которому можно щелкнуть правой кнопкой мыши файл BAS.
- Выберите Выбрать другое приложение → Еще приложения
- Последний шаг - выбрать опцию Найти другое приложение на этом. указать путь к папке, в которой установлен Microsoft Visual Studio. Теперь осталось только подтвердить свой выбор, выбрав Всегда использовать это приложение для открытия BAS файлы и нажав ОК .
Изменить приложение по умолчанию в Mac OS
Шаг 4. Убедитесь, что BAS не неисправен
Если вы выполнили инструкции из предыдущих шагов, но проблема все еще не решена, вам следует проверить файл BAS, о котором идет речь. Отсутствие доступа к файлу может быть связано с различными проблемами.
1. Проверьте BAS файл на наличие вирусов или вредоносных программ.
Если случится так, что BAS инфицирован вирусом, это может быть причиной, которая мешает вам получить к нему доступ. Немедленно просканируйте файл с помощью антивирусного инструмента или просмотрите всю систему, чтобы убедиться, что вся система безопасна. Если сканер обнаружил, что файл BAS небезопасен, действуйте в соответствии с инструкциями антивирусной программы для нейтрализации угрозы.
2. Убедитесь, что файл с расширением BAS завершен и не содержит ошибок
Если вы получили проблемный файл BAS от третьего лица, попросите его предоставить вам еще одну копию. В процессе копирования файла могут возникнуть ошибки, делающие файл неполным или поврежденным. Это может быть источником проблем с файлом. При загрузке файла с расширением BAS из Интернета может произойти ошибка, приводящая к неполному файлу. Попробуйте загрузить файл еще раз.
3. Проверьте, есть ли у вашей учетной записи административные права
Иногда для доступа к файлам пользователю необходимы права администратора. Выйдите из своей текущей учетной записи и войдите в учетную запись с достаточными правами доступа. Затем откройте файл BASIC Source Code Format.
4. Убедитесь, что ваше устройство соответствует требованиям для возможности открытия Microsoft Visual Studio
Если в системе недостаточно ресурсов для открытия файлов BAS, попробуйте закрыть все запущенные в данный момент приложения и повторите попытку.
5. Убедитесь, что ваша операционная система и драйверы обновлены
Последние версии программ и драйверов могут помочь вам решить проблемы с файлами BASIC Source Code Format и обеспечить безопасность вашего устройства и операционной системы. Устаревшие драйверы или программное обеспечение могли привести к невозможности использования периферийного устройства, необходимого для обработки файлов BAS.
Вы хотите помочь?
Если у Вас есть дополнительная информация о расширение файла BAS мы будем признательны, если Вы поделитесь ею с пользователями нашего сайта. Воспользуйтесь формуляром, находящимся здесь и отправьте нам свою информацию о файле BAS.
Читайте также: