Как считать данные из файла tcl bytecode
Работа с файлами.
Частые вопросы возникающие при работе с ботами. Загляните сюда перед созданием новой темы.Модератор: Модераторы
Работа с файлами.
Возникает множество вопросов о чтении файлов, замены строк в файле, удалении строк и т.д. Вот небольшой мануал по работе с файлами и строками.
1. Чтение всех строк из файла в список.
Это одна из самых основных операций при работе с файлами, которая используется в очень многих случаях, ознакомьтесь внимательно с ней!
Теперь у нас в переменной lines все строки из файла, далее смотрим другие операции с файлами.
2. Чтение случайной строки из файла (маленького).
существует множество причин для использования этого, скрипт цитат, случайных топиков. В данном примере расмотрим выбор одной строки, но вы можете легко выбирать и несколько строк из разных частей файла.
Теперь в переменной $randline у нас находится случайная строка. Если вы хотите получить несколько строк запустите последнюю часть года в цикле.
3. Удаление строки из файла.
Вам може понадобиться удалить строку из файла. Запомните что во многих языках, включая TCL номера элементов начинаются с 0. То-есть, чтобы удалить первую строку вам надо удалить строку с индексом 0, чтобы удалить вторую, с индексом 1. И так далее.
Как вы видите, для того, чтобы удалить строку из фала, сначала мы должны считать файл в память, удалить строку в памяти и затем переписать данные из памяти в файл. Если вы часто используете удаление и добавление строк лучше использовать базы данных. Также если файл с которы вы работаете очень большой (несколько мегабайт) эти операции будут занимать определенное время.
4. Добавление строки в файл.
Обычно строки добавляют в начало или в конец файла. В примере ниже рассмотрим последний вариант.
5. Добавление строки в конец файла.
Для добавления стоки в конец файла не обязательно считывать и перезаписывать файл полностью. Мы будем открывать файл в режиме "append mode".
Bart » 05 апр 2015 21:16
Если бы кто-то привёл пример, как взять не строку из файла, а искомое слово со всей строкой, было бы замечательно.Например, имеется test.data c
nick t3gwtg35h e4gegwww4
nick2 g33g3g4h hwsh4wh5
nick3 erygh34y4 5y4h45j
Два вопроса:
1. Как взять данные, например, из второй строки и вывести их в канал по команде: !команда nick2?
2. И как удалить эту строку?
Похожие процедуры есть в calc, qoute, но что-то я не понял их там. Bart писал(а): 1. Как взять данные, например, из второй строки и вывести их в канал по команде: !команда nick2?
2. И как удалить эту строку?
Сиди, разбирайся. Максимально добавил комментов в код
Tcl поддерживает обработку файлов с помощью встроенных команд открывать, читать, ставить, получать и закрывать.
Файл представляет собой последовательность байтов, не имеет значения, является ли это текстовым файлом или двоичным файлом.
Открытие файлов
Tcl использует команду open для открытия файлов в Tcl. Синтаксис для открытия файла выглядит следующим образом:
Здесь filename является строковым литералом, который вы будете использовать для именования вашего файла, и accessMode может иметь одно из следующих значений:
Открывает существующий текстовый файл для чтения, и файл должен существовать. Этот режим используется по умолчанию, если не указан accessMode.
Открывает текстовый файл для записи, если он не существует, то создается новый файл, иначе существующий файл усекается.
Открывает текстовый файл для записи в режиме добавления, и файл должен существовать. Здесь ваша программа начнет добавлять содержимое в существующий файл содержимого.
Открывает текстовый файл для чтения и записи как. Файл должен существовать уже.
Открывает текстовый файл для чтения и записи как. Сначала он обрезает файл до нулевой длины, если он существует, в противном случае создайте файл, если он не существует.
Открывает текстовый файл для чтения и записи как. Он создает файл, если он не существует. Чтение начнется с самого начала, но запись может быть только добавлена.
Любой файл, который был открыт программой, должен быть закрыт, когда программа заканчивает использовать этот файл. В большинстве случаев файлы не нужно закрывать явно; они закрываются автоматически, когда объекты File автоматически завершаются.
Написание файла
Команда Puts используется для записи в открытый файл.
Простой пример записи в файл показан ниже.
Когда приведенный выше код компилируется и выполняется, он создает новый файл input.txt в каталоге, в котором он был запущен (в рабочем каталоге программы).
Чтение файла
Когда приведенный выше код компилируется и выполняется, он читает файл, созданный в предыдущем разделе, и выдает следующий результат:
Когда приведенный выше код компилируется и выполняется, он читает файл, созданный в предыдущем разделе, и выдает следующий результат:
Как вы знаете, в среде Tcl есть такой проект Tbcload и формат файлов tbc. Никакой смысловой нагрузки, кроме как попытку скрыть исходные тексты скриптов tcl он не несет. Ибо , скрипты tcl по своей сути переносимы между разными платформами.
Исходники выше выложенной программы полностью заменяют procomp.exe (утилиту для создания Tbc-файлов из tcl-скриптов, из дистрибутивов: TclPro или TclDev ).. Или утилиту tclcompiler.exe ( tclcompiler84.exe , tclcompiler64) из пакета TclDevKit. Для её использования не нужно покупать лицензию.:) Но предназначена она прежде всего для программистов и людей, которые могут собрать её в VisualStudio. И использовать.
Основное использование проекта:
1) Исследовательское. Используя средства отладки Вы можете пошагово посмотреть как создается tbc-файл.
2) Вы можете бесплатно создавать (генерировать) tbc-файлы (tbcload v1.7).
3) иное.
Проект cmpWrite - был собран из исходников: tbcload_src (2006, v12) и tbcload_src (2010,v11). Почему такая нумерация версий, не спрашивайте - не знаем. Собран он был в 2011 году, в 2013 году - был обьединен с исходниками tcl8.6, но выкладываем мы его только сейчас. Как вы знаете, сейчас можно найти следующие варианты tbcload.dll - 1.3, 1.4, 1.7. Различие в них минимально, и в основном связанно с поддержкой дистрибутивов Tcl разных версий (Есть существенные отличия между Tcl8.0 - Tcl8.3 - Tcl8.6 в формате хранения и передаче данных).
Примечание к сборке проекта:
1) утилита создает tbc-файл из tcl-файла.
2) Для успешной компиляции - необходимо указать пути к заголовочным файлам .h и исходникам tcl - .с (находятся в проекте)
папка include
папка \tcl8.6.1\generic
3) для запуска утилиты необходимы dll интерпретатора - tcl86.dll, zlib1.dll
5) также, для запуска необходимы библиотеки tcl - папка lib
Схему работы программы попытаемся показать следующими шагами.
- находим функцию main(int argc, char* argv[]) в файле cmpWrite.c
char *inFilePtr = "1.tcl"; - эта переменная указывает на имя файла, из которого будем делать tbc-файл.
char *outFilePtr = NULL
- Дальше происходит инициализация Tcl-интепретатора и вызов главной функции: Compiler_CompileObj
Создаем новый обьект и читаем в него ВЕСЬ tcl-файл. Это очень важное замечание!.
cmdObjPtr = Tcl_NewObj();
result = Tcl_ReadChars(chan, cmdObjPtr, -1, 0);
Tcl работает с файловой системой через систему буферов. Этот механизм представляет файл как поток символов, который начинается с началом файла и заканчивается в конце файла. Таким образом, работа с файлом выглядит аналогично простому выводу данных на экран командой puts, только добавляется новый аргумент. Данные из файла читаются командой gets, и так же могут считываться с клавиатуры.
Перед началом работы с файлом программа должна открыть файл для каких-нибудь действий (чтение, запись, или оба) командой open. Как только файл откроется, программа может выполнить gets или puts для чтения или записи информации.
Так же программа может использовать seek для передвижения позиции в файле. После передвижения gets и puts будут работать с новой позицией.
Когда программа закончит работать с файлом, следует его закрыть. Число одновременно открытых программой файлов ограничено операционной системой.. Поэтому если не закрывать файлы, то программа может перестать работать.
Команды для работы с файлами следующие:
- r - Режим чтения. Файл должен существовать.
- r+ - Режим чтения и записи. Файл должен существовать.
- w - Режим записи. Создаёт файл если он не существует, или обнуляет существующий.
- w+ - Режим записи и чтения. Создаёт файл в случае необходимости, или обнуляет существующий.
- a - Режим добавления, открывает файл для записи. Файл должен существовать. Текущая позиция устанавливается на конец файла.
- a+ - Режим добавления, открывает на запись. Если файл не существует, то создаётся. Если существует - позиция устанавливается на конец файла.
- start - позиция измеряется от начала файла.
- current - позиция измеряется от текущей позиции в файле.
- end - позиция измеряется от конца файла.
Вот несколько моментов, которые следует помнить при работе с файлами:
Есть несколько стандартных указателей на файлы, которые создаются автоматически при запуске программы. Их можно использовать так же, как и обычные указатели:
- stdin - стандартный поток ввода (клавиатура)
- stdout - стандартный поток вывода (экран)
- strerr - стандартный поток ошибок (экран)
Работа с файлом осуществляется через буфер. Когда вы записываете данные, то они хранятся в памяти до того момента, пока процессор освободится, и они будут записаны на диск. Можно заставить компьютер записать данные на диск командой flush. Когда вы используете close или программа завершается, данные так же скидываются на диск. Однако при сбое буфер может не записаться на диск, и данные будут потеряны.
Количество открытых файлов ограничено, поэтому помните о том, что надо закрывать неиспользуемые файлы.
Чтобы определить конец файла используйте команду eof перед чтением очередной строки.
Вы не можете изменять существующие данные файла, если файл открыт в режиме добавления (a).
Открытие в режиме w+ позволяет изменять записанные данные, но очищает файл перед использованием.
Открывая файл в режиме r+ вы можете изменять его. Но можно открыть только существующий файл.
Все данные в Tcl хранятся как строки символов. Поэтому читая двоичный файл результат получится непредсказуем.
Я использую tcl в c, и вообще говоря, мы создаем новое пространство имен для каждого выполнения скрипта tcl. Если я использую proc в скрипте, будет ли он находиться в том же пространстве имен? как proc преобразуется в байт-код? преобразуется ли он под тем же пространством имен вызывающего абонента? будет ли он находиться в другом пространстве имен и может привести к недействительности байт-кода?
Не могли бы вы также дать мне краткое объяснение того, что такое байт-код tcl и как мы получаем переменные (как локальные, так и глобальные) из хэшей, и как upvar влияет на это?
1 ответ
Мне интересно, есть ли OS, который может запускать байт-код java без установки Java, например JavaOS (я знаю, что есть что-то под названием JavaOS, но я не думаю, что хочу этого). Все, что я хочу сделать, это запустить одну программу java на своем ноутбуке, и кажется расточительным запускать все.
Есть ли какой-нибудь способ перечислить все пользовательские вызовы proc в файле Tcl? ? У меня есть файл TCL, я хочу перечислить все процессы, которые были вызваны этим файлом. С уважением киртан
Каждая процедура в Tcl знает, что такое ее пространство имен; это то же самое, что и пространство имен, содержащее ее имя (оно всегда есть; глобальное пространство имен называется :: ). Как таковое, вероятно, не имеет большого смысла создавать новое пространство имен для каждого выполнения.
Сам байт-код (который выполняется на своего рода машине стека, определенной в tclExecute.c в исходном коде Tcl) создается, когда это необходимо, что обычно происходит, когда вы собираетесь выполнить процедуру в первый раз. Байт-код можно распечатать с помощью команды tcl::unsupported::disassemble :
Достаточно новые версии Tcl 8.6 также поддерживают tcl::unsupported::getbytecode , что обеспечивает машиночитаемый доступ к тем же видам информации. На самом деле вы не хотите анализировать вывод disassemble .
Вызов процедуры из другого пространства имен не делает байт-код для этой процедуры недействительным. (С чего бы это? Это было бы крайне неэффективно для библиотечного кода!) Но есть операции, которые знают, как получить доступ к внешнему миру. Давайте сделаем пример с upvar :
Последовательность операций для самого upvar состоит в том, чтобы поместить в стек параметр level и имя удаленной переменной (которое в данном случае происходит от переменной, переданной в качестве аргумента), а затем upvar %v1 , который связывает запись таблицы локальных переменных с индексом 1 с переменной в области 1 (вызывающий объект), вызванной именем, которое пришло из xvar . Привязка выполняется путем того, что локальная переменная фактически является указателем на другую переменную; после ее создания она очень эффективна. Команда global использует аналогичный механизм, но немного другой (код операции nsupvar привязывается к переменной в именованном пространстве имен).
Есть несколько операций, которые делают байт-код недействительным, но это такие вещи, как перемещение процедуры или команды с функцией компиляции. Если вы не используете rename , вам, вероятно, никогда не придется беспокоиться об этом (и это полностью автоматически).
Выполнение upvar в процедуру (обычно из другой процедуры) немного отличается, так как тогда вы просматриваете переменные по имени. Таблица имен для таблицы локальных переменных является частью метаданных процедуры, и любая переменная, отсутствующая в ней, хранится в таблице hash (она используется, когда у вас есть upvar в процедуре, которая использует имя, не используемое для других целей в качестве переменной внутри этого процесса; это может произойти, даже если это не очень распространено).
Если вам действительно нужны подробности, нет никакой замены чтению исходного кода Tcl. Байт-код генерируется в довольно многих местах, но его ядром является tclCompile.c ; соответствующий механизм выполнения находится в tclExecute.c . Процедуры определены в tclProc.c , пространства имен в tclNamesp.c и переменные в tclVar.c . Вероятно, есть и другие подходящие места для поиска, но это главные из них.
Я скомпилировал TCL 8.4.13 на сервере RHEL 5.1, однако я не знаю, как включить загрузчик TCL в эту программу, чтобы читать и выполнять скомпилированный код TCL. Я установил tbcload и TCLPro, однако мне необходимо использовать обычный TCL 8.4.13. Есть какие-нибудь идеи о том, как включить.
Я пытаюсь провести два процесса параллельно. Помогите мне написать код в tcl, который выполняет два процесса синхронно в TCL.
Похожие вопросы:
Я видел теорию и понимаю объяснение, почему первый байт-код быстрее второго, но я хочу увидеть байт-код в tcl. в python shell довольно легко увидеть байт-код, но мне трудно найти решение для.
As Scala также производит байт-код и выполняется JVM. Мне интересно, как JVM различает Scala байт-код и Java байт-код. Кто-нибудь может объяснить? Scalac Myprogram.scala java Myprogram Значит, это.
Мне интересно, есть ли OS, который может запускать байт-код java без установки Java, например JavaOS (я знаю, что есть что-то под названием JavaOS, но я не думаю, что хочу этого). Все, что я хочу.
Есть ли какой-нибудь способ перечислить все пользовательские вызовы proc в файле Tcl? ? У меня есть файл TCL, я хочу перечислить все процессы, которые были вызваны этим файлом. С уважением киртан
Я скомпилировал TCL 8.4.13 на сервере RHEL 5.1, однако я не знаю, как включить загрузчик TCL в эту программу, чтобы читать и выполнять скомпилированный код TCL. Я установил tbcload и TCLPro, однако.
Я пытаюсь провести два процесса параллельно. Помогите мне написать код в tcl, который выполняет два процесса синхронно в TCL.
Интерпретатор tcl преобразует код в байт-код во время выполнения, однако он нигде не хранится. Такое программное обеспечение, как tclpro, делает это. Может ли кто-нибудь подсказать мне, как этого.
Я очень новичок в этом деле, поэтому, пожалуйста, держите любой ответ в самой простой форме. Я пытаюсь установить процесс с помощью batch file. Этот процесс вызовет tcl, который ищет некоторые.
Читайте также: