Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблема с выводом потока в файл [WinXP]


inviz ©   (2009-01-15 14:56:00) 

Здравствуйте! Помогите пожалуста, зделал такую процедуру

procedure FileReplaceString(const FileName, strFind, strReplace: string);
  var
       fs: TFileStream;
       S: wideString;
begin
  fs := TFileStream.Create(FileName, fmOpenread or fmShareDenyNone);
  try
  SetLength(S, fs.Size);
  fs.ReadBuffer(S[1], fs.Size);
  finally
  fs.Free;
  end;
  S := StringReplace(S, strFind, strReplace, [rfReplaceAll, rfIgnoreCase]);
  fs := TFileStream.Create(FileName, fmCreate);
  try
  fs.WriteBuffer(S[1], Length(S));
  finally
  fs.Free;
  end;
end;

Открываю текстовый файл потоком, устанавливаю длинну строки S (WideString т.к. TXT файл большой) читаю файл в строку (потоком) заменяю в строке нужный текст своим записываю обратно в файл, когда открываю файл блокнотом там квадратики и каракули в чем может быть ошибка? что не так делается? Помогите пожалуста очень нада.


Anatoly Podgoretsky   (2009-01-15 19:15:00) [1]


> а почему в 2 раза больше то?

SizeOf(WideChar)


inviz   (2009-01-15 17:55:00) [2]


> han_malign ©   (15.01.09 17:48) [10]
> > TXT - текстовый файлик открывается блокнотом и нормально
> отображается, обычный текстовый файл. http://ru.wikipedia.
> org/wiki/Txt

Сумничал молодец "возьми с полки пиражок...".

Тема закрыта


han_malign   (2009-01-15 17:48:00) [3]


> TXT - текстовый файлик открывается блокнотом и нормально отображается, обычный текстовый файл.

http://ru.wikipedia.org/wiki/Txt


inviz   (2009-01-15 17:43:00) [4]

Проблема решилась :)

> Servy ©   (15.01.09 16:22) [4]
> > среда Delphi 2009Тогда AnsiString.

Заменил WideString на AnsiString все стало корректно отображатся Большое Спасиба :)


inviz   (2009-01-15 17:14:00) [5]


>  SetLength(S, fs.Size);  // размер S установлен в два раза
> больше

а почему в 2 раза больше то? по идее же как раз должно быть.

>  fs.WriteBuffer(S[1], Length(S)); // здесь наоборот, записано
> в два раза меньше

а тут тогда писать не Length(), а запоминать первоначальный размер строки в переменную (например size) а потом fs.WriteBuffer(S[1], size);?


inviz   (2009-01-15 17:08:00) [6]

читирую первый свой пост
> Открываю текстовый файл потоком, устанавливаю длинну строки
> S (WideString т.к. TXT файл большой)


TXT - текстовый файлик открывается блокнотом и нормально отображается, обычный текстовый файл.


Anatoly Podgoretsky   (2009-01-15 16:58:00) [7]

Забыл спросить, а в каком формате был текстовый файл?
Это ты тоже умолчал.
И видишь ли ты нормально этот файл до конвертирования.
Может у тебя не Юникод файл, а ты его как Юникод, тогда естественно, ты его калечишь


Anatoly Podgoretsky   (2009-01-15 16:57:00) [8]

Тогда ошибки здесь

 SetLength(S, fs.Size);  // размер S установлен в два раза больше
 fs.WriteBuffer(S[1], Length(S)); // здесь наоборот, записано в два раза меньше

Это конечно не объясняет проблем с квадартиками. Вероятнее всего что ты установил в блокноте не тот формат.


Servy   (2009-01-15 16:22:00) [9]

> среда Delphi 2009


Тогда AnsiString.


inviz   (2009-01-15 16:03:00) [10]


> Anatoly Podgoretsky ©   (15.01.09 16:00) [2]

среда Delphi 2009


Anatoly Podgoretsky   (2009-01-15 16:00:00) [11]

> inviz  (15.01.2009 14:56:00)  [0]

А какая у тебя среда?


MBo   (2009-01-15 15:26:00) [12]

wide убери, просто string


Наверх

Титульная страница Поиск, карта сайта Написать письмо