Главная страница
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.017 c
14-8631
andre
2003-10-05 09:33
2003.11.03
Что за фигня?


8-8553
dimodim
2003-07-04 13:04
2003.11.03
Как установить GlSCENE под 5-й делфи СРОЧНО!!!


4-8740
Dexter
2003-08-30 14:03
2003.11.03
Меню в чужой програме. Как с ним работать?


14-8605
k-man
2003-10-15 18:09
2003.11.03
Небольшой вопрос от начинающего в C++


6-8567
Шишкин Илья
2003-09-06 10:38
2003.11.03
Как закачать файл?