![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Помогите разобратся что я делаю не так? [D6, Win95/98]
Dmitriy_R © (2002-02-01 11:05:00)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). Подскажите что не так?
mrcat (2002-02-06 17:28:00) [1]Write/Read - это туфта. Используй отображение в память, все будет прекрасно работать. Можно также попробовать через BlockRead/Write - если бы не см. Write/Read.
Фэ (2002-02-04 13:13:00) [2]Разговариваем.
Юрий Зотов (2002-02-04 11:47:00) [3]> По-моему, тут все ясно.
По-моему, тоже. Про AnsiString, вроде бы, все читали, пресловутые 12 байт всем известны. О чем спор - не пойму.
:о)
Фэ (2002-02-03 10:52:00) [4]Все правильно.
ANSI string может содержать любые символы.
Использование ее своими методами ничем Вас не ограничит, пока не встретиться приведение к PChar.
Дельфи - это обертка.
Поэтому пр вызове Label1.Caption дело доходит в конце концов до
"windows zero terminating string" и здесь паскалевская строка обрезается по нулю.
Набережных С. (2002-02-02 15:59:00) [5]Юрий Зотов © (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!
По-моему, тут все ясно.
Anatoly Podgoretsky (2002-02-02 14:26:00) [6]Юрий Зотов © (01.02.02 14:12)
Юрий ты удивляешь, #0 не является признаком окончания строки (AnsiString), он просто добавляется для совместимости с PChar, а так строка может содержать любые символы от 0 до 255 также как и ShortString
Юрий Зотов (2002-02-01 20:49:00) [7]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. Это надежнее - Вы сами себя страхуете от ошибок.
Набережных С. (2002-02-01 20:24:00) [8]>yaJohn
Все правильно. Ноль сыграет роль при PChar(s1).
yaJohn (2002-02-01 15:03:00) [9]
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 ispolzovaniestringv kachestve binarnogovremennogo bufera. Nikakih GetMem,Free i pr.
Юрий Зотов (2002-02-01 14:12:00) [10]> yaJohn © (01.02.02 13:13)
Потому что String - это по умолчанию длинная строка, для которой символ #0 является признаком конца строки. То есть, искусственно вставить его в середину строки все-таки можно, но после этого строка получится "обрезанной".
А паскалевская строка (ShortString) может содержать любые символы.
yaJohn (2002-02-01 13:13:00) [11]2 Юрий Зотов ©
Ya rabotau so string s lubimi simvolami, vkluchaya #0. Poka vse poluchalos"... Mojet ya Vas ne pravilno ponial, pochemu imenno ShortString???
yaJohn (2002-02-01 13:11:00) [12]
var f:file;
reset(f,1);
BlockWrite(f,s[1],length(s));
closefile(f);
Eto po starinke. A luchshe uchitsia rabotat" s potokami.
Dmitriy_R (2002-02-01 13:07:00) [13]Всем спасибо пришлось ограничить себя в издевательстве код 1-255.
Отказался от кода "0"
А кстати как работать с bin файлом.
Фэ (2002-02-01 12:42:00) [14]Введи ограничение на "издевательство" - коды 32..255 и пиши в текст.файл.
Либо используй bin файл.
Юрий Зотов (2002-02-01 12:42:00) [15]ShortString, а не стринг.
Dmitriy_R (2002-02-01 12:36:00) [16]Даже если Data объявлен как стринг до строки
Write(F, Data);
все доходи как надо а в файл пишется не все.
Я предполагаю что кода я объявляю
var F: TextFile;
Может надо не TextFile а что нить другое типа что это файл данных.
Юрий Зотов (2002-02-01 12:16:00) [17]Надо объявить Data как ShortString. Такая строка может содержать любые симвлолы, в том числе и #0. Но если она будет содержать #26, то при чтении файл будет "обрезан".
Dmitriy_R (2002-02-01 12:12:00) [18]Не не то, в смысле я не так объяснил.
Попробую по другому объяснить:
Имею строку Data := "1234567890";
Далее я над ней издеваюсь(к примеру кодирую)
в результате чего получаю строку с набором непонятных символов в диапазоне Char( от 0 до 255);
Вот и вопрос как записать файл если к примеру все десять знаков после моего издевательства стали равны Char(0);
Тоесть файл длинной 10 байт а внутри пусто.
Turalyon (2002-02-01 12:02:00) [19]Поппробуй
Data := "Здесь все что угодто" + #0 + #1 + #13 + #20 + " и т.д.";
Юрий Зотов (2002-02-01 11:45:00) [20]А в Вашей строке и нет никаких спецсимволов, откуда же им взяться в файле?
Попробуйте так:
Data := "Здесь записаны #0, #1, #13, #20: "#0#1#13#20" и т.д.";
Только не пытайтесь записать символ #26.