Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.



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

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

Наверх





Память: 0.49 MB
Время: 0.004 c
3-66482
AndrewK
2002-01-29 09:16
2002.02.21
Как составить SQL запрос


1-66515
Дремучий
2002-01-25 13:39
2002.02.21
Маскимизация окна с BorderStyle = bsDialog


3-66489
harismatik
2002-01-29 10:56
2002.02.21
Как увидеть список всех таблиц в базе данных Interbse?


14-66662
помогите мне
2002-01-02 13:40
2002.02.21
Помогите !


3-66477
VLL
2002-01-29 11:13
2002.02.21
Как упаковать таблицу DBF





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский