Главная страница
    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.008 c
8-8550
dozer
2003-06-29 01:05
2003.11.03
ShockwaveFlash в Delphi


3-8335
Geugenk
2003-10-11 16:19
2003.11.03
Table.eof


14-8658
Сергей Суровцев
2003-10-14 10:07
2003.11.03
Файлы заменяются старыми копиями.


4-8728
aldapooh
2003-08-28 13:23
2003.11.03
NetUserGetInfo


6-8565
Dennisius
2003-09-07 22:15
2003.11.03
Ложь и все тут :)





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