Форум: "Основная";
Текущий архив: 2004.11.21;
Скачать: [xml.tar.bz2];
ВнизВвод из текстового файла через Pchar Найти похожие ветки
← →
Алеся (2004-11-05 14:21) [0]Подскажите, как мне прочитать текстовый файл, используя переменные только типа Pchar.
← →
-=SS=- © (2004-11-05 14:36) [1]используешь переменные типа String, а потом переобразовываешь в PChar
Var
S:String;
P:PChar;
Begin
.....
GetMem(P,255);
P:=PChar(S);
.........
FreeMem(P,255);
End;
<code/>
← →
clickmaker © (2004-11-05 14:43) [2]var p: pchar;
h := CreateFile(...
GetMem(p, filesize)
ReadFile(h, p^, filesize)
← →
Алеся (2004-11-05 15:02) [3]Спасибо большое за ответы. Но я бы хотела по-простому, используя while not oef()... Можно ли как-нибудь так?
← →
-=SS=- © (2004-11-05 15:13) [4]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;
← →
VMcL © (2004-11-05 15:42) [5]>>-=SS=- © (05.11.04 15:13) [4]
Откуда заранее известно, что в каждой из строк не более 254 символов?
← →
jack128 © (2004-11-05 16:00) [6]-=SS=- © (05.11.04 15:13) [4]
GetMem(P,255);
P:=PChar(S);
Утечка памяти.
← →
Алеся (2004-11-05 16:35) [7]У меня ещё вопрос. Я читаю из файла через разыменование 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.
← →
PVOzerski © (2004-11-05 16:36) [8]Если не секрет, в чем высокий смысл такого ограничения?
← →
-=SS=- © (2004-11-05 17:40) [9]
> 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);
> Утечка памяти.
И где там утечка ?
← →
Алеся (2004-11-05 17:40) [10]Не секрет. Просто нашему преподу по программированию уже за 65, вот и сказываются годы на требованиях к студентам. А если учесть, что я на геофаке учусь, и программирование мне совсем не нужно, то я думаю, вы меня поймете :-(
← →
jack128 © (2004-11-05 17:42) [11]-=SS=- © (05.11.04 17:40) [9]
И где там утечка ?
Да.... Сначала выделил память, потом затер указатель на эту память.. Как теперь её освобождать будешь??
← →
-=SS=- © (2004-11-05 18:09) [12]FreeMem(P,255); А это для чего как вы думаете уважаемый ???
← →
PVOzerski © (2004-11-05 18:25) [13]В принципе, к элементам строки pChar можно обращаться и по индексу, без ^ (причем начальный эелемент - естественно, 0). Судя по всему, приведение типов pChar -> AnsiString мало обрадует Вашего преподавателя. Я бы предложил открыть файл через Reset(file_var,1), выделить блок размером в FileSize(file_var)+1, закачать туда всё содержимое файла через blockread, добавить завершающий #0 и закрыть файл. Вроде бы, слова "построчно" в условиях нет. Правда, файл, как сказано, текстовой, а то, что я говорю, приложимо к файлу нетипизированному. Ну, а если файл дожен быть именно TextFile с точки зрения Delphi, пожалуй, придется посимвольно читать через read, с таким преподом :^)
>А если учесть, что я на геофаке учусь, и программирование мне совсем не нужно
А вот я биофак закончил, потом специально к вечерникам-физиологам ходил программированию учиться и до сих пор не жалею, что ходил...
← →
Юрий Зотов © (2004-11-05 18:36) [14]> -=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:37) [15]> -=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 19:04) [16]>> GetMem(P,255);
>> P:=PChar(S);
>> Утечка памяти.
> И где там утечка ?
При приведении pChar -> AnsiString не происходит копирования массива, просто указателю на блок символов в заголовке строки присваивается значение pChar. Поэтому последствия такого присвоения эквивалентны по последствиям вот такому:
GetMem(P,255);
P:=P2;{да хоть nil}. Это ж не COM, "сборщика мусора" нет.
← →
Алеся (2004-11-05 22:35) [17]Большое всем спасибо. Я разобралась.
← →
Verg © (2004-11-05 22:55) [18]
> Ввод из текстового файла через 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));
...........
← →
Piter © (2004-11-05 23:12) [19]Сильно сомневаюсь...
← →
Piter © (2004-11-05 23:13) [20]Алеся (05.11.04 22:35) [17]
Большое всем спасибо. Я разобралась.
Сильно сомневаюсь...
P.S. Verg неудачно вклинился :)
← →
KSergey © (2004-11-06 12:33) [21]> [20] Piter © (05.11.04 23:13)
> Алеся (05.11.04 22:35) [17]
> Большое всем спасибо. Я разобралась.
>
> Сильно сомневаюсь...
Ну и зря
Главное - человек довольный ушел ;)
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.11.21;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.033 c