Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-1099913616
ОлегЪ
2004-11-08 14:33
2004.11.21
Инитересный ресурс


14-1099639552
eukar
2004-11-05 10:25
2004.11.21
Простая школьная задачка


14-1099510505
VID
2004-11-03 22:35
2004.11.21
Теперь я ищу нормальное агенство :)


1-1099778557
Logun
2004-11-07 01:02
2004.11.21
Сжатие данных


14-1099658179
ОлегЪ
2004-11-05 15: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
Английский Французский Немецкий Итальянский Португальский Русский Испанский