Главная страница
    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.49 MB
Время: 0.037 c
14-1097861050
Sergey_Masloff
2004-10-15 21:24
2004.11.21
Вино соцопросы и АИФ. Оффтопик


11-1082730937
Max003
2004-04-23 18:35
2004.11.21
Как сделать форму, перетаскивуемую за любое место.


14-1099917610
1g0r
2004-11-08 15:40
2004.11.21
Ищу игру "Пижамчик"


3-1098778531
goldenmax
2004-10-26 12:15
2004.11.21
не работает запрос Поооооомоооооооооогите SOS!!!!!


4-1097491005
rainy_2002'
2004-10-11 14:36
2004.11.21
Как получить информацию о пользователе?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский