Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 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 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.




Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.02.21;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.75 MB
Время: 0.025 c
3-66497           Rash                  2002-01-28 12:15  2002.02.21  
Удаление строки в stringgrid, разные кодировки и временные файлы запросов.


14-66673          Bizon                 2002-01-03 10:04  2002.02.21  
Новый год.


14-66667          Гаечка                2001-12-20 15:30  2002.02.21  
Нужна помощь


1-66525           MystiX                2002-02-05 18:34  2002.02.21  
Help!!!


1-66513           Yu2                   2002-02-05 22:50  2002.02.21  
Grid с повышеными возможностями