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

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

Глюк ord на символе 26. [D7, XP]


promomix ©   (2006-02-03 02:21:00) 

Привет. Такая проблемма, пытаюсь перевести строку:


For i := 1 to Length(koi) do
 begin
  postr := ord(koi[i]);
  result := result+' '+IntToStr(postr);
end;


Но, если в строчке(koi), появляеться символ с кодом 26, то процедура останавливаеться :/ всымле яко бы этот символ последний. В чём проблема, а главное как исправить?


Германн   (2006-02-04 01:50:00) [1]


> SergP ©   (03.02.06 22:40) [15]

Ты не туда выстрелил. АП как раз подтведил твои (и не только твои) высказывания.
Хотя тут можно и поспорить. :)


SergP   (2006-02-03 22:40:00) [2]


> Anatoly Podgoretsky ©   (03.02.06 21:33) [14]
> Это не текстовый файл!


А что же тогда такое "строка" в не текстовом файле?


Anatoly Podgoretsky   (2006-02-03 21:33:00) [3]

Это не текстовый файл!


SergP   (2006-02-03 20:18:00) [4]


> promomix   (03.02.06 19:00) [11]
> SergP.   (03.02.06 12:48) [10]
> Неподходит. =(
> Мне нужно считывать строчку, передавать считанные данные
> ф-цие кои_8. Далее следующую строчку, и тд.


В таком случае что называется строкой в файле, где присутствуют #26 ???


Desdechado   (2006-02-03 19:13:00) [5]

чем не подходит-то?
У тебя будет строка длиной во весь файл, крути ей, как хочешь


promomix   (2006-02-03 19:00:00) [6]

SergP.   (03.02.06 12:48) [10]
Неподходит. =(
Мне нужно считывать строчку, передавать считанные данные ф-цие кои_8. Далее следующую строчку, и тд.


SergP.   (2006-02-03 12:48:00) [7]


> promomix   (03.02.06 10:30) [9]
> а, теперь ясно. действительно больше похоже на cEOF.
> подскожите как это обойти, желательно кодом на основе выше
> приведённого. спасибо за ответы.


Если тебе нужно полностью прочитать содержимое файла в переменную string, то:

function LoadFromFile(const Filename:string):string;
var
 SizeStr:integer;
begin
with TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite) do
 try
   SizeStr := Size - Position;
   SetString(Result, nil, SizeStr);
   Read(Pointer(Result)^, SizeStr);
 finally
   Free;
 end;
end;


promomix   (2006-02-03 10:30:00) [8]

а, теперь ясно. действительно больше похоже на cEOF.
подскожите как это обойти, желательно кодом на основе выше приведённого. спасибо за ответы.


begin...end   (2006-02-03 10:12:00) [9]

Я, конечно, извиняюсь, но 26 -- это не перевод строки, а признак конца файла (cEOF).


TUser   (2006-02-03 09:46:00) [10]

Дело в том, что readln ри чтении из файла принимает символ 26 за конец строки. Т.к. в текстовом файле такого символа не должно быть (по мнению разработчиков). Конец строки не читается, и результат функции length() будет не тем, которого ты ожидаешь.


ЮЮ   (2006-02-03 07:24:00) [11]


> его смысла тут я тоже не понимаю

Смысл в том, что если символ #26 в строке есть, то процедура его выведет, а не "остановится", как говоришь ты. дело просто с том, что никакого симвла #26 в твоей строке нет и быть не может (см.[5])


КаПиБаРа   (2006-02-03 07:16:00) [12]

promomix   (03.02.06 2:21)
появляеться символ с кодом 26

Этот символ в текстовых файлах означает перевод строки, т.е. у тебя строка читается только до этого символа. Что бы обработать остальной текст нужно читать строки в цикле. Если это не текстовый файл, т.е. в нем встречаются другие непечатные символы нужно работать с ним как с нетекстовым.


promomix   (2006-02-03 05:56:00) [13]

ЮЮ ©   (03.02.06 04:57) [3]
Непонимаю,
"просто в строке нет тех символов, что ты ожидаешь (она короче)."
Как это понимать?

Код кстатьи ничем не отличаеться от того, что я привёл, его смысла тут я тоже не понимаю =/


ЮЮ   (2006-02-03 04:57:00) [14]


> то процедура останавливаеться


Процедура не останавливается, просто в строке нет тех символов, что ты ожидаешь (она короче).

procedure TForm1.Button1Click(Sender: TObject);
var
 koi: string;
 i, postr: integer;
begin
 koi := #20#21#22#23#24#25#26#27#28#29;
 Caption := '';
 for i := 1 to Length(koi) do
 begin
  postr := ord(koi[i]);
  Caption := Caption + ' ' + IntToStr(postr);
 end;
end;


ЮЮ   (2006-02-03 03:29:00) [15]

Негоже рассматривать файл, содержащий "непечатные" символы, как textfile и пользоваться ReadLn


promomix   (2006-02-03 02:36:00) [16]

Вот конкретный пример код, который неработает, если в строчке имееться символ "26":


program Project1;

{$APPTYPE CONSOLE}

uses
 SysUtils;

var
 koi:string;
 CFile:textfile;

function koi_8(koi:string):string;
var i:integer;
var postr:integer;
begin
For i := 1 to Length(koi) do
begin
 postr := ord(koi[i]);
 result := result+' '+IntToStr(postr);
end;
end;

begin
AssignFile(CFile,'dig.cry');
Reset(CFile);
ReadLn (CFile,koi);
CloseFile(CFile);
writeln(koi); //без ord'a
writeln(koi_8(koi)); //с ord'ом
readln;
end.


P.S. содержимое dig.cry:
"\x1A\Ыю6K\x188Љ#Џ\x1A\x1A\x1A\x1A\x1A"
или
"26 348 3547 1534 54 843 24 56 4234 35 2447 26 26 26 26 26"


Наверх

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