![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ввод из текстового файла через Pchar [D7]
Алеся © (2004-11-05 14:21:00)Подскажите, как мне прочитать текстовый файл, используя переменные только типа Pchar.
KSergey (2004-11-06 12:33:00) [1]> [20] Piter © (05.11.04 23:13)
> Алеся (05.11.04 22:35) [17]
> Большое всем спасибо. Я разобралась.
>
> Сильно сомневаюсь...
Ну и зря
Главное - человек довольный ушел ;)
Piter (2004-11-05 23:13:00) [2]Алеся (05.11.04 22:35) [17]
Большое всем спасибо. Я разобралась.
Сильно сомневаюсь...
P.S. Verg неудачно вклинился :)
Piter (2004-11-05 23:12:00) [3]Сильно сомневаюсь...
Verg (2004-11-05 22:55:00) [4]
> Ввод из текстового файла через Pchar
> [D7]
>
> Алеся (05.11.04 14:21)
> Подскажите, как мне прочитать текстовый файл, используя
> переменные только типа Pchar.
В рамках языка Паскаль в современном пониманиии (Delphi, FreePascal) это звучит как минимум странно. Но, тем не менее, извращаться, так извращаться:
var
P : pcharж
PSize, ReadSize : pchar;
Readed : pchar;
F : file; // Вот тут затруднение, реальное
...
P := nil;
PSize := nil;
ReadSize := nil;
while not eof(F) do
begin
if PSize <= ReadSize then
begin
PSize := PSize + 2048;
ReallocMem( P, Integer(PSize) );
end;
BlockRead(F, P[Integer(ReadSize)], Integer(PSize-ReadSize), Integer(Readed) );
if Integer(Readed) > 0 then
Inc( ReadSize, integer(Readed) )
else
break;
end;
ReallocMem(P, integer(ReadSize));
...........
Алеся (2004-11-05 22:35:00) [5]Большое всем спасибо. Я разобралась.
PVOzerski (2004-11-05 19:04:00) [6]>> GetMem(P,255);
>> P:=PChar(S);
>> Утечка памяти.
> И где там утечка ?
При приведении pChar -> AnsiString не происходит копирования массива, просто указателю на блок символов в заголовке строки присваивается значение pChar. Поэтому последствия такого присвоения эквивалентны по последствиям вот такому:
GetMem(P,255);
P:=P2;{да хоть nil}. Это ж не COM, "сборщика мусора" нет.
Юрий Зотов (2004-11-05 18:37:00) [7]> -=SS=- © (05.11.04 18:09) [12]
GetMem(P, 255); // P указывает на вновь выделенные 255 байт. ОК.
P := PChar(S); // А теперь куда указывает P?
...
FreeMem(P, 255); // Что здесь будет освобождено? Здравствуй, AV.
А выделенные 255 байт так и повисли в памяти. Утечка.
Юрий Зотов (2004-11-05 18:36:00) [8]> -=SS=- © (05.11.04 18:09) [12]
GetMem(P, 255); // P указывает на вновь выделенные 255 байт. ОК.
P := PChar(S); // А теперь куда указывает P?
...
FreeMem(P, 255); // Что здесь будет освобождено? Здравствуй, AV.
А выделенные 255 байт так и повисли в памяти. Утечка.
PVOzerski (2004-11-05 18:25:00) [9]В принципе, к элементам строки pChar можно обращаться и по индексу, без ^ (причем начальный эелемент - естественно, 0). Судя по всему, приведение типов pChar -> AnsiString мало обрадует Вашего преподавателя. Я бы предложил открыть файл через Reset(file_var,1), выделить блок размером в FileSize(file_var)+1, закачать туда всё содержимое файла через blockread, добавить завершающий #0 и закрыть файл. Вроде бы, слова "построчно" в условиях нет. Правда, файл, как сказано, текстовой, а то, что я говорю, приложимо к файлу нетипизированному. Ну, а если файл дожен быть именно TextFile с точки зрения Delphi, пожалуй, придется посимвольно читать через read, с таким преподом :^)
>А если учесть, что я на геофаке учусь, и программирование мне совсем не нужно
А вот я биофак закончил, потом специально к вечерникам-физиологам ходил программированию учиться и до сих пор не жалею, что ходил...
-=SS=- (2004-11-05 18:09:00) [10]FreeMem(P,255); А это для чего как вы думаете уважаемый ???
jack128 (2004-11-05 17:42:00) [11]-=SS=- © (05.11.04 17:40) [9]
И где там утечка ?
Да.... Сначала выделил память, потом затер указатель на эту память.. Как теперь её освобождать будешь??
Алеся (2004-11-05 17:40:00) [12]Не секрет. Просто нашему преподу по программированию уже за 65, вот и сказываются годы на требованиях к студентам. А если учесть, что я на геофаке учусь, и программирование мне совсем не нужно, то я думаю, вы меня поймете :-(
-=SS=- (2004-11-05 17:40:00) [13]
> GetMem(P,255);
> P:=PChar(S);
> // Делаешь всё что нужно с P
> FreeMem(P,255); //потом освобождаем память
> jack128 © (05.11.04 16:00) [6]
> -=SS=- © (05.11.04 15:13) [4]
> GetMem(P,255);
> P:=PChar(S);
> Утечка памяти.
И где там утечка ?
PVOzerski (2004-11-05 16:36:00) [14]Если не секрет, в чем высокий смысл такого ограничения?
Алеся (2004-11-05 16:35:00) [15]У меня ещё вопрос. Я читаю из файла через разыменование r, а потом это добавляю к строке p. Я написала:
var
p,x:pchar;
...
x:=strnew(pchar(''));
r:=strnew(pchar(''));
while not eof(f) do begin
read(f,p^);
strcat(x,p);
end;
Но почему-то этот цикл выполняется всего 1 раз. Как это можно сделать, вообще не используя тип string, а только pchar.
jack128 (2004-11-05 16:00:00) [16]-=SS=- © (05.11.04 15:13) [4]
GetMem(P,255);
P:=PChar(S);
Утечка памяти.
VMcL (2004-11-05 15:42:00) [17]>> -=SS=- © (05.11.04 15:13) [4]
Откуда заранее известно, что в каждой из строк не более 254 символов?
-=SS=- (2004-11-05 15:13:00) [18]Var
F:TextFile;
S:String;
P:PChar;
Begin
assignFile(F,'C:\tt.txt');
reset(F);
While (Not EOF(F)) do
Begin
Read(F,S);
GetMem(P,255);
P:=PChar(S);
// Делаешь всё что нужно с P
FreeMem(P,255); //потом освобождаем память
End;
End;
Алеся (2004-11-05 15:02:00) [19]Спасибо большое за ответы. Но я бы хотела по-простому, используя while not oef()... Можно ли как-нибудь так?
clickmaker (2004-11-05 14:43:00) [20]var p: pchar;
h := CreateFile(...
GetMem(p, filesize)
ReadFile(h, p^, filesize)