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

Вниз

Ввод из текстового файла через 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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.028 c
3-1098806092
GigoVich
2004-10-26 19:54
2004.11.21
TDBGrid + TQuery + FireBird (embeded)


9-1090802077
Xerx
2004-07-26 04:34
2004.11.21
Экспорт модели


14-1099855294
Piter
2004-11-07 22:21
2004.11.21
А дайте простенькую программу на C#


1-1099556887
Lamer v.-0.00001
2004-11-04 11:28
2004.11.21
Процесы


10-1053603853
Aleksandr
2003-05-22 15:44
2004.11.21
Как избежать подвисания клиента при попытке сконнектиться?