Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.11.03;
Скачать: [xml.tar.bz2];

Вниз

array of Char и TFileStream   Найти похожие ветки 

 
Eagle Owl   (2003-10-22 00:47) [0]

Привет, мастера!
Проблема вот в чём.
Имеется динамический массив Char. В него заносится строка и потом необходимо её записать в файл при помощи TFileStream. Как это правильно сделать, а то у меня чё-то не получается.
Спасибо.


 
Романов Р.В.   (2003-10-22 05:51) [1]

Покажи код


 
Anatoly Podgoretsky   (2003-10-22 09:15) [2]

Eagle Owl © (22.10.03 00:47)
Наверно неправильно делаешь.
А как неправильно?


 
Eagle Owl   (2003-10-22 12:20) [3]

Заполнение массива опустим... с этим проблем нет.
В итоге он получается, например, такой: ch = ("П", "р", "и", "в", "е", "т", "!")
.........
smFile: TFileStream;
ch: array of Char;
pch: Pointer;
begin
..........
pch := ch;
..........
smFile := TFileStream.Create("F:\test.txt", fmCreate);
smFile.Write(pch, sizeof(ch));
smFile.Free;
end;
В файл пишется что-то очень сильно отличное от Привет!


 
Eagle Owl   (2003-10-22 12:24) [4]

Если можно, подскажите статейку про использование TFileStream...


 
Eagle Owl   (2003-10-22 12:24) [5]

Если можно, подскажите статейку про использование TFileStream...


 
PVOzerski   (2003-10-22 12:37) [6]

Тут вот в чем дело...
Метод описан так:
function Write(const Buffer; Count: Longint): Longint;

По внутреннему-то представлению, конечно, Buffer передается как указатель, но синтаксис требует, чтобы Вы в скобках написали не указатель как таковой, а то, на что он указывает. Притом есть еще одна тонкость: переменная типа "динамический массив" есть на самом деле тоже указатель, а собственно блок памяти начинается по адресу 0-го элемента массива. При этом SizeOf, естественно, выдаст 4 - как размер переменной типа "указатель". А для длины массива есть Length(). Резюмирую:

smFile.Write(ch[0], length(ch));

либо же (но с избыточными, IMHO, действиями):
pch := @ch[0];
....
smFile.Write(pch^, length(ch));


 
Юрий Федоров   (2003-10-22 12:37) [7]

Писать в Stream нужно не Pointer, а значение
smFile.Write(ch[0], Length(ch));


 
Reindeer Moss Eater   (2003-10-22 12:38) [8]

smFile.Write(pch^, sizeof(ch));

Только зачем тебе вообще pointer понадобился?


 
Eagle Owl   (2003-10-22 14:59) [9]

Спасибо, разобрался наконец.
Чё-то я зациклился на том, что под Buffer"ом подразумевается именно указатель на Buffer. Где-то такое встречалось...
Ещё раз всем спасибо!


 
Юрий Зотов   (2003-10-22 16:51) [10]

И еще:
packed array of char


 
PVOzerski   (2003-10-22 17:29) [11]

2 Юрий Зотов:
А с каких пор в массивах у Delphi появилось выравнивание - не record же?


 
Юрий Федоров   (2003-10-22 17:31) [12]

>>PVOzerski © (22.10.03 17:29) [11]
А почему обязательно record ??
packed class - пожалуйста )))
Не знаю скаких пор, но в D6 точно есть


 
PVOzerski   (2003-10-22 17:38) [13]

Да нет, формально-то конструкция пройдет. Но вот по сути.
Я проверил:
t1=array[1..99]of char;
t2=packed array [1..99]of char;
...
showmessage(inttostr(sizeof(t1))+" "+inttostr(sizeof(t1)));
выдает 99 99

Вряд ли в случае динамических массивов иначе. А вот у записей, действительно, через директивы компилятора и слово packed выравниваем можно управлять.


 
Anatoly Podgoretsky   (2003-10-22 17:50) [14]

Массивы имеют точные размеры, но если этот массив будет использован в записи, но тогда слово packed будет применено к ней самой, а на массив не повлияет. Хотя посмотрим что скажет Юрий, у негонаверно были сображения когда писал.



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

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

Наверх




Память: 0.47 MB
Время: 0.013 c
1-8465
Шишкин Илья
2003-10-24 18:11
2003.11.03
Как убрать значок приложения с TaskBar a


14-8647
Карлсон
2003-10-13 13:41
2003.11.03
спамеры совсем озверели!


1-8369
Master
2003-10-23 05:09
2003.11.03
<B>Adress in WebBrowser?</B> Why not ../htm/index.htm


4-8713
arous
2003-08-29 14:54
2003.11.03
Две формы


1-8340
Nikolas
2003-10-24 21:17
2003.11.03
Из String в PChar





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