Четверг, 21 Ноября 2024, 20:27

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Запись hex-кода в файл
Andrey_MДата: Среда, 12 Декабря 2012, 22:13 | Сообщение # 1
старожил
Сейчас нет на сайте
Итак, как я уже говорил, я пилю текстовый редактор.

Для некоторых целей мне требуется в сиём текстовом редакторе сделать запись нечитаемых агрументов в файле (названия файла, кодирование, некоторые другие параметры)... но если открыть файл просто так, то он прочитает весь текст! Поэтому нужно записать данные не текстовоЮ, а бинарно, и потом прочитать их из файла.

Вопрос - как это реализовать в Free Pascal?


ЪЪЪЪ! Лучшая благодарность - плюс в репутацию :-)
GECKДата: Четверг, 13 Декабря 2012, 07:45 | Сообщение # 2
заслуженный участник
Сейчас нет на сайте
Функции BlockWrite/BlockRead, например.

Всё гениальное просто. И хреново работает.
Andrey_MДата: Четверг, 13 Декабря 2012, 12:59 | Сообщение # 3
старожил
Сейчас нет на сайте
Поподробнее можно?

ЪЪЪЪ! Лучшая благодарность - плюс в репутацию :-)
uberchelДата: Суббота, 15 Декабря 2012, 13:53 | Сообщение # 4
частый гость
Сейчас нет на сайте
Есть много вариантов, вообще для такого дела нужно использовать потоки.
Покажу простой и конечно не быстрый вариант, для больших файлов не подходит:

Code
function StrToHex(S: String): String;
var I: Integer;
begin
   Result:= '';
   for I := 1 to length (S) do
     Result:= Result+IntToHex(ord(S[i]),2);
end;


// скоро тут что нибудь появится )
Andrey_MДата: Суббота, 15 Декабря 2012, 16:26 | Сообщение # 5
старожил
Сейчас нет на сайте
Спасибо!

А чтение оттуда как сделать?


ЪЪЪЪ! Лучшая благодарность - плюс в репутацию :-)
TimKruzДата: Понедельник, 17 Декабря 2012, 19:55 | Сообщение # 6
старожил
Сейчас нет на сайте
Quote (uberchel)
Result:= ''; for I := 1 to length (S) do Result:= Result+IntToHex(ord(S[i]),2);

Нельзя считать значение result, в него только записывать можно (потому что это не переменная). Да и вообще, зачем тут шестнадцатеричное представление чисел? Andrey_M хочет писать в файл помимо текста управляющую информацию.

Andrey_M, можно, например, в начале файла записывать нужные переменные (типа первый байт=N - длина названия, далее N байт названия и т.д.), которые будут считываться редактором, но не отображаться на экране. Или вставлять управляющие символы, или вообще тегами делать (получится типа xml, т.е. куча лишних байт, но читабельно, если открыть простым "блокнотом").
А для преобразования символов в "бинарный формат" можно использовать ord(x:char):byte, возвращающий код символа, и chr(x:byte):char, возвращающий символ по коду. Т.е. ord(' ')=32 (код пробела = 32) и chr(32)=' '.
Открывать файлы можешь как текст, а можешь как нетипизированный файл (var f:file;). В нетипизированном файле read/ln и write/ln не работают, нужно использовать blockread/blockwrite. Ну или использовать типизированный файл (используются только read и write) байт или слов (2 байта), как тебе будет удобнее.

Quote (Andrey_M)
Поэтому нужно записать данные не текстовоЮ, а бинарно, и потом прочитать их из файла.

"Бинарный" файл можно открыть как "текстовый" и прочитать его содержимое как текст. И наоборот, "текстовый" - как "бинарный" и прочитать числа или структурированные данные. Все эти названия ("текстовый", "бинарный", "структурированный", "ещё какая-то фигня") условны и используются человеком только для определения типа содержимого конкретного файла. На диске файл хранится в виде последовательности байт. Буквы и вообще символы кодируются одним (или двумя в расширенных кодировках) байтом, т.е. каждый символ соответствует какому-то определённому числу, а текстовый редактор, открывая файл, отображает на экране символы, соответствующие числам-кодам в файле.

P.S. Скачай НОРМАЛЬНУЮ книгу-учебник по TurboPascal и прочитай внимательно от корки до корки, пробуя на практике каждую новую для тебя функцию. Тогда большинство твоих "нубских" вопросов отпадут.


Andrey_MДата: Понедельник, 17 Декабря 2012, 20:01 | Сообщение # 7
старожил
Сейчас нет на сайте
Quote (TimKruz)
по TurboPascal

Я на фри работаю.ъ


ЪЪЪЪ! Лучшая благодарность - плюс в репутацию :-)
ReanДата: Понедельник, 17 Декабря 2012, 20:04 | Сообщение # 8
участник
Сейчас нет на сайте
Quote (Andrey_M)
Я на фри работаю

Не имеет значения.


Сообщение отредактировал Rean - Понедельник, 17 Декабря 2012, 20:04
Andrey_MДата: Понедельник, 17 Декабря 2012, 22:39 | Сообщение # 9
старожил
Сейчас нет на сайте
Quote (Rean)
Не имеет значения.

Как я помню, разница всё же есть.ъ


ЪЪЪЪ! Лучшая благодарность - плюс в репутацию :-)
TimKruzДата: Вторник, 18 Декабря 2012, 21:57 | Сообщение # 10
старожил
Сейчас нет на сайте
Quote (Andrey_M)
Как я помню, разница всё же есть.

Ты сначала внимательно изучи и освой на практике все основы Pascal, которые для TP и FP одни и те же, да и для Delphi с Lazarus, ну и вообще научись алгоритмы писать. А различия между FP и другими диалектами как-нибудь потом изучишь, если это тебе вообще понадобится...


Andrey_MДата: Среда, 19 Декабря 2012, 09:17 | Сообщение # 11
старожил
Сейчас нет на сайте
Quote (TimKruz)
Ты сначала внимательно изучи и освой на практике все основы Pascal, которые для TP и FP одни и те же, да и для Delphi с Lazarus, ну и вообще научись алгоритмы писать. А различия между FP и другими диалектами как-нибудь потом изучишь, если это тебе вообще понадобится...

Сейчас почти все учебники по Free Pascal совмещены с учебниками по Lasarus... причём в тех, которые мне попадались, акцент на последний язык и его тупой графический интерфейс.


ЪЪЪЪ! Лучшая благодарность - плюс в репутацию :-)
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг