Форум: "Основная";
Текущий архив: 2002.02.21;
Скачать: [xml.tar.bz2];
ВнизПомогите разобратся что я делаю не так? Найти похожие ветки
← →
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 ispolzovaniestring
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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.005 c