Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Filestream read|write - непонятная кодировка


Автор: Sanek123 29.10.2011, 20:11
Здравствуйте. Помогите разобраться. Вопрос чайника - потому в разделе для чайников. Прошу не давать ссылки в гугл (уж три дня там сижу, надоело)

Код

    function ReadStream(FPath:String) : String;
    Procedure WriteStream(FPath,buf:String);
    procedure FormActivate(Sender: TObject);
    procedure Button1Click(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  Buf, Path:string;
  f:TFileStream;
implementation

{$R *.dfm}

function TForm1.ReadStream (FPath:String) : String;
begin
  try
    F := TFileStream.Create(FPath, fmShareDenyNone);
    F.Read(Buf,32);
  finally
    FreeAndNil(F);
  end;
  result:=Buf;
end;

Procedure TForm1.WriteStream(FPath, buf:String);
var
Len:integer;
begin
  try
    Len:=Length(buf);
    F := TFileStream.Create(Fpath, fmOpenReadWrite);
    F.Write(Buf,Len);
  finally
    FreeAndNil(F);
  end;
end;

procedure TForm1.FormActivate(Sender: TObject);
begin
Path:='c:\log.txt';
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
WriteStream(Path,'stroka');
if ReadStream(Path)<>'' then Showmessage(buf);
end;


файл текстовый, кодировка ANSI.

в сообщении и в текстовике караказябра. Что не так и / или что нужно сделать, как исправить.

и еще по поводу параметров:

если задаю параметр fmShareDenyNone - ни чтения, ни записи, вообще ничего не происходит, но и ошибок не выдает. 
если задаю параметр fmOpenReadWrite - выдает караказябру.

однако мне всеже необходим первый параметр, т.к. фаил используется несколькими приложениями, и если он на момент чтения записи занят, то вылетает ошибка (не могу читать, писать - файл занят).

и еще (очень хочеться) доработать чтение,запись нужной строки, например чтото вроде

Код

function TForm1.ReadStream (FPath:String; Pos:integer) : String;
begin
  try
    F := TFileStream.Create(FPath, fmShareDenyNone);
    F.Read(Pos,Buf,32);
  finally
    FreeAndNil(F);
  end;
  result:=Buf;
end;

 
а как будет правильно?

Автор: CodeMonkey 29.10.2011, 21:09
Код
TFileStream.Create(FPath, fmShareDenyNone);


Шо за бред? Не указан режим открытия. F1 нажмите.

Код
F.Write(Buf,Len);


Buf - это указатель. Вы портите память, а не читаете строку. Передавать надо значение строки, а не указатель. Не говоря уже о том, что прежде чем что-то передавать, под это что-то надо выделить память.

Мат-часть:
http://www.transl-gunsmoker.ru/2009/09/blog-post.html
http://www.transl-gunsmoker.ru/2009/09/pchars.html

Добавлено через 1 минуту и 3 секунды
А, ну ещё и версия Delphi значение имеет. Домашнее задание: разобраться в отличиях String и AnsiString (подсказка: нажмите F1).

Автор: northener 29.10.2011, 23:47
Цитата(Sanek123 @  29.10.2011,  20:11 Найти цитируемый пост)
и еще по поводу параметров:

если задаю параметр fmShareDenyNone - ни чтения, ни записи, вообще ничего не происходит, но и ошибок не выдает. 
если задаю параметр fmOpenReadWrite - выдает караказябру.

Этот параметр - "битовая маска". Так что константы типа fmXXX можно комбинировать арифметически или логически для передачи в качестве параметра.

Автор: Sanek123 30.10.2011, 00:00
Цитата

Buf - это указатель. Вы портите память, а не читаете строку. Передавать надо значение строки, а не указатель. 

buf:string - это строка, а не указатель(pointer).

Цитата

Не говоря уже о том, что прежде чем что-то передавать, под это что-то надо выделить память.


разьве здесь не указано количество?
Код

    F.Write(Buf,Len);

где
Код

Len:=Length(buf);


хотя может len надо было бы еще умножить на кол-во байт на символ для типа String.

Цитата

Домашнее задание: разобраться в отличиях String и AnsiString


Я это и спрашиваю. Если караказябра из-за несоответствия типов - так и скажи, а не остри по поводу F1.

А что касается fmShareDenyNone то в одной из тех умных книжек что мне здесь советовали сказано что данный параметр используется как раз в том случае когда возникают трудности с доступом к файлу.

Добавлено через 2 минуты
Цитата

Этот параметр - "битовая маска". Так что константы типа fmXXX можно комбинировать арифметически или логически для передачи в качестве параметра.


а подробнее (понятнее). что есть битовая маска?

Автор: northener 30.10.2011, 00:44
Цитата(Sanek123 @  30.10.2011,  00:00 Найти цитируемый пост)
buf:string - это строка, а не указатель(pointer).

Это именно указатель на адрес в памяти ячейки, в которую записан адрес "области памяти", в которой содержится та самая строка.

Добавлено @ 00:48
Цитата(Sanek123 @  30.10.2011,  00:00 Найти цитируемый пост)
а подробнее (понятнее). что есть битовая маска?
 ???
P.S. И кое-кто говорит мне о том, что уроки ЮЗ сейчас не нужны!

Автор: Sanek123 30.10.2011, 10:27
ребята так объясните почему передавая сразу строку

Код

    F.WriteBuffer('stroka',Len);


работает, а если туже строку, но посредством переменной, 

Код

    str:='stroka';
    F.Write(str,Len);


то не работает?

Автор: Snowy 31.10.2011, 15:58
потому что string - это указатель, а shortstring - непосредственно строка.
Писать нужно саму строку, начиная с нужного символа:
Код

F.Write(str[1],Len);

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)