Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Filestream read|write - непонятная кодировка 
:(
    Опции темы
Sanek123
Дата 29.10.2011, 20:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 201
Регистрация: 22.10.2008

Репутация: нет
Всего: нет



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

Код

    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;

 
а как будет правильно?
--------------------
Вас разыскивают бойцы 139-го порта...
PM MAIL   Вверх
CodeMonkey
Дата 29.10.2011, 21:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 29
Всего: 89



Код
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).


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
northener
Дата 29.10.2011, 23:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 12
Всего: 20



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

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

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


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
Sanek123
Дата 30.10.2011, 00:00 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 201
Регистрация: 22.10.2008

Репутация: нет
Всего: нет



Цитата

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

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

Цитата

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


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

    F.Write(Buf,Len);

где
Код

Len:=Length(buf);


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

Цитата

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


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

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

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

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


а подробнее (понятнее). что есть битовая маска?
--------------------
Вас разыскивают бойцы 139-го порта...
PM MAIL   Вверх
northener
Дата 30.10.2011, 00:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 12
Всего: 20



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

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

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


Это сообщение отредактировал(а) northener - 30.10.2011, 00:56


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
Sanek123
Дата 30.10.2011, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 201
Регистрация: 22.10.2008

Репутация: нет
Всего: нет



ребята так объясните почему передавая сразу строку

Код

    F.WriteBuffer('stroka',Len);


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

Код

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


то не работает?
--------------------
Вас разыскивают бойцы 139-го порта...
PM MAIL   Вверх
Snowy
Дата 31.10.2011, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 31
Всего: 484



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

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

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0495 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.