Проблема с чтением из файла

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Проблема с чтением из файла

Сообщение Анафема » 02.08.2006 10:24:03

есть такой код:
Код: Выделить всё
var
  fn: String;
  ptr: Pointer;
  f, size, len: Integer;
begin
  fn := BuildFileName(FPath, AName);
  f := FileOpen(fn, fmOpenRead);
  size := FileSeek(f, 0, fsFromEnd);
  FileSeek(f, 0, fsFromBeginning);
  ptr := GetMem(size);
  if (ptr = nil) then
  begin
    FileClose(f);
    Result := nil;
    Exit;
  end;
  len := FileRead(f, ptr, size);
  if (len <> size) then
  begin
    FreeMem(ptr);
    FileClose(f);
    Result := nil;
    Exit;
  end;
  FileClose(f);


до строчки FileRead все пашет, дальше вылетает access violation
адрес ... функция fpc_ansistr_incr_ref

Что это за хрень и как с ней бороться, подскажите плиз.
Анафема
новенький
 
Сообщения: 10
Зарегистрирован: 18.07.2006 15:33:05

Сообщение Анафема » 02.08.2006 11:44:47

Решил этот вопрос сам, след. вопрос: при записи в файл пишутся первые 4 байта, потом пишется почему-то символ конца строки и 3 нуля, после этого все данные идут нормально. Т.е. 4 байта информации теряются.
Что делать???
Анафема
новенький
 
Сообщения: 10
Зарегистрирован: 18.07.2006 15:33:05

Сообщение @lex » 02.08.2006 13:09:41

Поробуй юзать TFileStream или просто assignfile... :)
Использование TFileStream:
(разбирался сам, читая исходники FP, поэтому может быть тут не всё корректно, но работает! )
Код: Выделить всё
...............
uses classes;
................
var Stream:TStream;
...............
Stream := TFileStream.Create ( 'C:\autoexec bat :) ' , fmOpenRead); //Открываем файл для чтения
Stream.Position:=0; //Тот же seek
Stream.ReadBuffer (buf, count); //Аналогия с BlockRead
................
Stream.Free;

Примерно так...
С записью я сам не особо не разбирался (не было необходимости), поэтому см. исходники FPC...
@lex
постоялец
 
Сообщения: 180
Зарегистрирован: 19.06.2006 13:16:29
Откуда: Невинномысск

Сообщение shade » 03.08.2006 11:21:30

Анафема писал(а):функция fpc_ansistr_incr_ref
Знакомая ситуация. У меня как-то тоже в подобной ситуации глюки были. Только в моем случае "BuildFileName" (не она конкретно..) была развернута (т.е. тело было ставлено как есть). Долго долгоя я голову ломал, пока не взялся за ассемблер... В общем вынес я код со строковыми операциями в отдельную процедуру и все заработало.

Мораль: в fpc глючит счетчик ссылок для строк (string/WideString), возможно так же глючат и интерфейсы, не проверял.

Совет: отдели обработку строк от отстального кода. В данном случае, н-р, можно по пробовать вынести два первых оператора в отдельную функцию :?

Анафема писал(а):Решил этот вопрос сам, след. вопрос: при записи в файл пишутся первые 4 байта, потом пишется почему-то символ конца строки и 3 нуля, после этого все данные идут нормально. Т.е. 4 байта информации теряются.
Что делать???
Код в студию, а то ничего не понятно :roll:
Аватара пользователя
shade
энтузиаст
 
Сообщения: 879
Зарегистрирован: 21.02.2006 20:15:48
Откуда: http://shamangrad.net/

Сообщение Анафема » 04.08.2006 10:42:09

Решил вопрос юзаньем TFileStream
Всем спасибо
Анафема
новенький
 
Сообщения: 10
Зарегистрирован: 18.07.2006 15:33:05


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10

Рейтинг@Mail.ru