Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

ANSI код символа EOF


Страницы:   1 2

leonidus ©   (2005-10-06 14:01:00) 

Люди подскажите пожалуйста ANSI код символа EOF. Дело в том, что в результате кодирования тектового файла путем изменения ANSI кодов каждого символа в соответсвии с ключом кодирования где-то в середине файла появляется знак EOF и потом при чтении этого файла программа на этот моменте "запинается" т.е. считает что файл уже весь считан, хотя это не так. Как мне узнать код символа EOF, что бы еще на этапе кодирования если такой символ получается просто заменять его на безобидный символ?


leonidus   (2005-10-06 22:10:00) [1]

Я прочел нормально файл из потока:

FS := TFileStream.create(...);
try
 SetLength(Str, FS.Size);
 FS.Read(Pointer(Str)^, Length(str));
finally
 FS.Free
end;


clickmaker   (2005-10-06 17:02:00) [2]


> leonidus ©   (06.10.05 16:07) [18]

потому что, если у тебя не unicode, то код символа должен быть от 0 до 255 - 1 байт то бишь


Anatoly Podgoretsky   (2005-10-06 16:48:00) [3]

leonidus ©   (06.10.05 15:14) [17]
ЗИП не подходит -  это точно такой же двоичный формат, нужна транспортная упаковка, например HEX ил Base64, UUE


leonidus   (2005-10-06 16:07:00) [4]

>clickmaker а почему символы больше 255 исключать? дело в том что у меня при суммировании: kod:=ord(st[i])+ord(key[n]); kod как правило больше 255 получается....


leonidus   (2005-10-06 15:14:00) [5]

что значит упаковать, zip`ом?


Anatoly Podgoretsky   (2005-10-06 14:56:00) [6]

leonidus ©   (06.10.05 14:01)  
Ошибка в постановке, у тебя не текстовый файл соответвтвенно с ним надо работать как с двоичным.

leonidus ©   (06.10.05 14:39) [14]
Нельзя работать с закодированным файлом как с текстовым, в нем все коды от 0 до 255, надо его упаковывать, тогда пойдут и методы работы с текстовыми файлами.


clickmaker   (2005-10-06 14:44:00) [7]

ну для начала я бы писал так
if (kod = 0) or (kod > 255) then
 st[i] := '_'

VCL при чтении файла не юзает никаких EOF, кроме реального конца файла. Можешь убедиться, открыв исходники и проследив TStrings.ReadFromFile -> ReadFromStream -> TFileStream.Read -> FileRead -> ReadFile. Последний - АПИшный вызов, ему на все символы, включая EOF и пр. глубоко фиолетово, он читает файл как есть
Трабла скорей всего в стринглисте


leonidus   (2005-10-06 14:39:00) [8]

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


leonidus   (2005-10-06 14:37:00) [9]

>clickmaker да нет вроде символов с кодом 0 нет. Я кодирую так:

const
key='abc'
...
...
begin

//читаем не кодированный текстовый файл помещая его в одну строчку
st:=''
for i:=0 to f.Count-1 do
st:=st+f.Strings[i];

//шифруем его
n:=0;
for i:=1 to length(st) do
 begin
  inc(n);
  if n>length(key) then n:=1;
  kod:=ord(st[i])+ord(key[n]);
  if kod=0 then
    st[i]:='_'
   else
    st[i]:=chr(kod);
 end;

и где может быть трабла?


Leonid Troyanovsky   (2005-10-06 14:33:00) [10]


> Leonid Troyanovsky ©   (06.10.05 14:30) [11]

> AFAIK, это был  Ctrl+Z, т.е. $1E.


$1A, sorry.
Ну, тут уже и без этого разобрались.

--
Regards, LVT.


Leonid Troyanovsky   (2005-10-06 14:30:00) [11]


> Германн ©   (06.10.05 14:16) [4]
> $15 считался признаком конца файла.


AFAIK, это был  Ctrl+Z, т.е. $1E.  

--
Regards, LVT.


MBo   (2005-10-06 14:29:00) [12]

Если кодировать текст таким образом, то файл уже не текстовый, и обращаться с ним нужно соответствующим образом. Нужен закодированный текстовый - значит, нужно правильно кодировать.
Ни к чему разные вещи смешивать.


Германн   (2005-10-06 14:28:00) [13]

Ну и глупо закодированный файл "пихать" в StringList ДОперекодировки.


clickmaker   (2005-10-06 14:24:00) [14]


> leonidus ©   (06.10.05 14:17) [5]

а ты уверен, что у тебя в файле нет символов с кодом 0? Тогда надо либо наследовать стринглист и переписывать SetTextStr, либо читать как бинарник, можно API - CreateFile / ReadFile. И я не верю, что это дольше. СтрингЛист-то в конечном итоге все равно к АПИ обращается.


Bel   (2005-10-06 14:21:00) [15]

Если мне не изменяет память, символ конца файла = 26 = #1A.


isasa   (2005-10-06 14:20:00) [16]

$1A (Ctrl+Z) ?


leonidus   (2005-10-06 14:17:00) [17]

я делаю так:

f_:=tstringlist.Create;
f_.LoadFromFile(Edit2.Text+'code');
st:='';
for i:=0 to f_.Count-1 do
 st:=st+f_.Strings[i];
f_.Free;

так вот в этом случае чтение ведется до первого символа EOF.

Пробовал читать BlockRead, нормально, но очень долго.


Германн   (2005-10-06 14:16:00) [18]

Вообще-то где-то, когда-то было такое. $15 считался признаком конца файла. Но не знаю я как написать программу, которая на нем "запиналась" :(


clickmaker   (2005-10-06 14:12:00) [19]

и кто тебе мешает читать до конца файла, а не до этого символа?


leonidus   (2005-10-06 14:06:00) [20]

да


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо