Форум: "Основная";
Текущий архив: 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