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

Вниз

Помогите разобратся что я делаю не так?   Найти похожие ветки 

 
Dmitriy_R   (2002-02-01 11:05) [0]

function OptionsLoad(): Integer;
var F: TextFile;
Data: String;
label Error;
begin
Data := "Здесь все что угодто #0 #1 #13 #20 и т.д.";
AssignFile(F, WinDir+"\Sr.cfg");
{$I-}
Reset (F);
If IOResult <> 0 then Rewrite(F);
{$I+}
If IOResult <> 0 then goto Error;
Rewrite(F);
Write(F, Data);
CloseFile(F);
Result := 0;
Exit;
Error:
Result := 1;
end;
А результат получается текст без дополнительных знаков(#0 #1 #13 #20). Подскажите что не так?


 
Юрий Зотов ©   (2002-02-01 11:45) [1]

А в Вашей строке и нет никаких спецсимволов, откуда же им взяться в файле?

Попробуйте так:

Data := "Здесь записаны #0, #1, #13, #20: "#0#1#13#20" и т.д.";

Только не пытайтесь записать символ #26.


 
Turalyon ©   (2002-02-01 12:02) [2]

Поппробуй

Data := "Здесь все что угодто" + #0 + #1 + #13 + #20 + " и т.д.";




 
Dmitriy_R   (2002-02-01 12:12) [3]

Не не то, в смысле я не так объяснил.
Попробую по другому объяснить:
Имею строку Data := "1234567890";
Далее я над ней издеваюсь(к примеру кодирую)
в результате чего получаю строку с набором непонятных символов в диапазоне Char( от 0 до 255);
Вот и вопрос как записать файл если к примеру все десять знаков после моего издевательства стали равны Char(0);
Тоесть файл длинной 10 байт а внутри пусто.


 
Юрий Зотов ©   (2002-02-01 12:16) [4]

Надо объявить Data как ShortString. Такая строка может содержать любые симвлолы, в том числе и #0. Но если она будет содержать #26, то при чтении файл будет "обрезан".


 
Dmitriy_R   (2002-02-01 12:36) [5]

Даже если Data объявлен как стринг до строки
Write(F, Data);
все доходи как надо а в файл пишется не все.
Я предполагаю что кода я объявляю
var F: TextFile;
Может надо не TextFile а что нить другое типа что это файл данных.


 
Юрий Зотов ©   (2002-02-01 12:42) [6]

ShortString, а не стринг.


 
Фэ ©   (2002-02-01 12:42) [7]

Введи ограничение на "издевательство" - коды 32..255 и пиши в текст.файл.
Либо используй bin файл.


 
Dmitriy_R   (2002-02-01 13:07) [8]

Всем спасибо пришлось ограничить себя в издевательстве код 1-255.
Отказался от кода "0"
А кстати как работать с bin файлом.


 
yaJohn ©   (2002-02-01 13:11) [9]

var f:file;

reset(f,1);
BlockWrite(f,s[1],length(s));
closefile(f);


Eto po starinke. A luchshe uchitsia rabotat" s potokami.


 
yaJohn ©   (2002-02-01 13:13) [10]

2 Юрий Зотов ©
Ya rabotau so string s lubimi simvolami, vkluchaya #0. Poka vse poluchalos"... Mojet ya Vas ne pravilno ponial, pochemu imenno ShortString???


 
Юрий Зотов ©   (2002-02-01 14:12) [11]

> yaJohn © (01.02.02 13:13)

Потому что String - это по умолчанию длинная строка, для которой символ #0 является признаком конца строки. То есть, искусственно вставить его в середину строки все-таки можно, но после этого строка получится "обрезанной".

А паскалевская строка (ShortString) может содержать любые символы.


 
yaJohn ©   (2002-02-01 15:03) [12]

procedure TForm1.Button1Click(Sender: TObject);
var s1,s2: string;
begin
s1:="Hello World!";
s1[6]:=#0;
Label1.Caption:=s1;//Hello
s2:=s1;
s2[6]:="?";
Label2.Caption:=s2;//Helo?World!
end;

Ili ya vsetaki ne ponial o chem vi?
Izvinite za fleim, no eto vopros vajniy. Ya, naprimer, nahoju ochen udobnim ispolzovanie string v kachestve binarnogo vremennogo bufera. Nikakih GetMem,Free i pr.


 
Набережных С.   (2002-02-01 20:24) [13]

>yaJohn
Все правильно. Ноль сыграет роль при PChar(s1).


 
Юрий Зотов ©   (2002-02-01 20:49) [14]

s1:="Hello World!";

s1[6]:=#0;
Label1.Caption:=s1; //Hello

Это и есть та обрезка, о которой я говорил. Идем далее.

s2:=s1;

Здесь пока еще не происходит выделения памяти для s2 и копирования тела строки s1. Вместо этого копируется значение указателя и в s1 увеличивается счетчик ссылок. Пока еще s1 и s2 указывают на одну и ту же область памяти: Pointer(s1) = Pointer(s2).


s2[6]:="?";

Вот теперь под s2 выделяется память и в нее копируется тело строки (но не до #0, а вся выделенная под тело s1 память), адрес s2 становится другим, в s1 счетчик ссылок уменьшается, а в s2 увеличивается и лишь потом в тело s2 подставляется 6-й символ. Теперь s1 и s2 - это разные строки с разными адресами.

Естественно, PChar(S1) даст "Hello", остальное будет обрезано.

А для бинарных буферов лучше использовать динамические мачссивы - array of byte. Это надежнее - Вы сами себя страхуете от ошибок.


 
Anatoly Podgoretsky ©   (2002-02-02 14:26) [15]

Юрий Зотов © (01.02.02 14:12)

Юрий ты удивляешь, #0 не является признаком окончания строки (AnsiString), он просто добавляется для совместимости с PChar, а так строка может содержать любые символы от 0 до 255 также как и ShortString


 
Набережных С.   (2002-02-02 15:59) [16]

Юрий Зотов © (01.02.02 20:49)

"Вот теперь под s2 выделяется память и в нее копируется тело строки (но не до #0, а вся выделенная под тело s1 память)"

Вот именно.

s1:="Hello,Word!";
s1[6]:=#0;
s2:=s1;
s1[6]:="#";
Label1.Caption:=s2;//Hello
s2[6]:="?";
Label2.Caption:=s2;//Hello?Word!
Label3.Caption:=s1;//Hello#Word!

По-моему, тут все ясно.


 
Фэ ©   (2002-02-03 10:52) [17]

Все правильно.
ANSI string может содержать любые символы.
Использование ее своими методами ничем Вас не ограничит, пока не встретиться приведение к PChar.
Дельфи - это обертка.
Поэтому пр вызове Label1.Caption дело доходит в конце концов до
"windows zero terminating string" и здесь паскалевская строка обрезается по нулю.


 
Юрий Зотов ©   (2002-02-04 11:47) [18]

> По-моему, тут все ясно.

По-моему, тоже. Про AnsiString, вроде бы, все читали, пресловутые 12 байт всем известны. О чем спор - не пойму.

:о)


 
Фэ ©   (2002-02-04 13:13) [19]

Разговариваем.


 
mrcat   (2002-02-06 17:28) [20]

Write/Read - это туфта. Используй отображение в память, все будет прекрасно работать. Можно также попробовать через BlockRead/Write - если бы не см. Write/Read.



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

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

Наверх




Память: 0.51 MB
Время: 0.008 c
3-66474
AndrewK
2002-01-29 10:22
2002.02.21
Где найти HELP по SQL


4-66721
Latspell
2001-12-21 16:39
2002.02.21
Memory maped files, hooks, DLL s, global heap - помогите разобраться.


14-66682
MJH
2001-12-20 17:37
2002.02.21
FAR vs WC


3-66452
Laimer
2002-01-28 14:27
2002.02.21
QRepord


1-66540
maks_f
2002-02-04 11:24
2002.02.21
Пароль на изменение в листе Excel