Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.02.19;
Скачать: [xml.tar.bz2];

Вниз

Глюк 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.075 c
2-1138550619
13
2006-01-29 19:03
2006.02.19
ActionMainMenuBar


2-1138793792
dera
2006-02-01 14:36
2006.02.19
Как прервать цикл While?


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


5-1125399541
SarDoX
2005-08-30 14:59
2006.02.19
Выделение в Stringgrid


15-1138354595
Gbp
2006-01-27 12:36
2006.02.19
Нужен Delphi программист для выполнения разовой работы.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский