Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.11.03;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.015 c
8-8550
dozer
2003-06-29 01:05
2003.11.03
ShockwaveFlash в Delphi


1-8385
md
2003-10-24 16:10
2003.11.03
открытие группы файлов


3-8272
Sectey
2003-10-14 11:05
2003.11.03
Какой запрос ОПТИМАЛЬНЕЕ


1-8390
Aleksandr
2003-10-22 17:56
2003.11.03
Можно ли как-то при помощи директив компилятора изменить exename?


14-8655
Думкин
2003-10-14 04:28
2003.11.03
С днем рождения! 14 октября.