Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.02.19;
Скачать: CL | DM;

Вниз

Глюк ord на символе 26.   Найти похожие ветки 

 
promomix   (2006-02-03 02:21) [0]

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


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


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


 
promomix   (2006-02-03 02:36) [1]

Вот конкретный пример код, который неработает, если в строчке имееться символ "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:
"\Ыю6K8Љ#Џ"
или
"26 348 3547 1534 54 843 24 56 4234 35 2447 26 26 26 26 26"


 
ЮЮ ©   (2006-02-03 03:29) [2]

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


 
ЮЮ ©   (2006-02-03 04:57) [3]


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


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

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;


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

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

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


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

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

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


 
ЮЮ ©   (2006-02-03 07:24) [6]


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

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


 
TUser ©   (2006-02-03 09:46) [7]

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


 
begin...end ©   (2006-02-03 10:12) [8]

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


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

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


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


> 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 19:00) [11]

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


 
Desdechado ©   (2006-02-03 19:13) [12]

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


 
SergP ©   (2006-02-03 20:18) [13]


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


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


 
Anatoly Podgoretsky ©   (2006-02-03 21:33) [14]

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


 
SergP ©   (2006-02-03 22:40) [15]


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


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


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


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

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



Страницы: 1 вся ветка

Текущий архив: 2006.02.19;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.052 c
2-1139071227
HITMAN
2006-02-04 19:40
2006.02.19
TLabel


1-1137584481
UnDISCOvery
2006-01-18 14:41
2006.02.19
NTFS - Как быстро заполнить жесткий диск?


2-1138810241
Viktop
2006-02-01 19:10
2006.02.19
Модели баз данных


4-1133771010
psa247
2005-12-05 11:23
2006.02.19
Время работы процесса !


15-1138510812
begin...end
2006-01-29 08:00
2006.02.19
С Днём рождения! 29 января