Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.10.2007, 10:03   #1
Uomo
Пользователь
 
Регистрация: 24.10.2007
Сообщений: 19
По умолчанию Сохранение из файлового потока в файл.

С помощью приведенного ниже кода, я просматриваю файл типа *.xml, *.html на наличие Sum, при нахождении Sum я копирую в буферную строку bufstr. Затем создаю файл и записываю в него данные из bufstr.
Но после того как открываю файл, там такой вот текст: A t .
ShowMessage(bufstr); выводит нормальный текст.
Вопрос: как добится нормальной кодировки?

Код:
procedure TFindText.Button2Click(Sender: TObject);
var
 haystack : String;
 bufstr: String;
 fil: TFileStream; //Переменная типа объект TFileStream.
 po: integer;
begin
  f:= TStringList.Create();
  f.LoadFromFile('d:\log.txt'); // Загружаю текстовый файл
  j:= 0;
 for i:=0 to f.Count-1 do // Запускаю цикл
  begin // Начало для цикла
   haystack:= f.Strings[I];
   po:= Pos('Sum', haystack) + 5;
   if Pos('Sum',haystack) = 0 then //Если i-я строка равна нужной то
     j:= 1
   else
    begin
     bufstr:= Copy(haystack, po, 7);
     fil:= TFileStream.Create('d:\log.log', fmCreate or fmOpenWrite);
     fil.Write(bufstr, 7);
     //fil.write(pointer(fil)^, 7);
     ShowMessage(bufstr);
     Application.MessageBox('Строка найдена',
    'Запись удачно записана в файл', MB_OKCANCEL)
    end;
  end;
  if j= 1 then
   Application.MessageBox('Строк больше не найдено',
   'Поиск закончен', MB_OKCANCEL);

f.Free;
end;
Uomo вне форума Ответить с цитированием
Старый 25.10.2007, 10:14   #2
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

1. Узнайте в какой кодировке страница, с которой вы берете текст, потом уже можно и перевести в нужную кодировку
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Старый 25.10.2007, 10:18   #3
Uomo
Пользователь
 
Регистрация: 24.10.2007
Сообщений: 19
По умолчанию

Цитата:
Сообщение от Квэнди Посмотреть сообщение
1. Узнайте в какой кодировке страница, с которой вы берете текст, потом уже можно и перевести в нужную кодировку
Кодировка файла откуда копируются данные ANSI. Но я пробовал копировать и цифры, получается то же самое.
Uomo вне форума Ответить с цитированием
Старый 25.10.2007, 10:24   #4
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

Код:
{ **** UBPFD *********** by delphibase.endimus.com ****
>> Универсальное и быстрое перекодирование строки из кодировок
ANSI, KOI8-R, KOI8-U, OEM/DOS, ISO

В этой функции используется элементарный алгоритм, который по скорости работы
опережает свои аналоги, и позволяет перекодировать текст из различных кодировок.
Для перекодирования строки используется универсальная функция ConvertEncoding,
где в качестве первого параметра выступает строка, которую необходимо
перекодировать, а в качестве второго - матрица перекодирования, которая
определяет из какой кодировки в какую необходимо перекодировать данную строку.

В этой версии имеется 6 видов матриц перекодирования (тип TCodeMatrix):
1. cmAnsiToKoi8R - перекодирует строку из кодировки ANSI в кодировку KOI8-R
2. cmAnsiToKoi8U - перекодирует строку из кодировки ANSI в кодировку KOI8-U
3. cmKoi8RToAnsi - перекодирует строку из кодировки KOI8-R в кодировку ANSI
4. cmKoi8UToAnsi - перекодирует строку из кодировки KOI8-U в кодировку ANSI
5. cmOemDosToAnsi - перекодирует строку из кодировки OEM/DOS в кодировку ANSI
6. cmIsoToAnsi - перекодирует строку из кодировки ISO в кодировку ANSI

Зависимости: System;
Автор:       VEG, veg@tut.by, Республика Беларусь - Слуцк
Copyright:   ©VEG, 31.10.2003
Дата:        31 октября 2003 г.
***************************************************** }

type // Тип матриц перекодировки
  TCodeMatrix = array[1..255] of char;
const // Матрицы перекодировки
  FirstCodes =
    #1#2#3#4#5#6#7#8#9#10#11#12#13#14#15#16#17#18#19#20#21#22#23#24#25#26#27#28+
   #29#30#31' !"#$%&''()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^' +
    '_`abcdefghijklmnopqrstuvwxyz{|}~';
  cmAnsiToKoi8R: TCodeMatrix = FirstCodes // ver 1.0, ©VEG, 31.10.2003
  + 'ЂЃ‚ѓ„…†‡?‰Љ‹ЊЌЋЏђ‘’“”•–—˜™љ›њќћџ ЎўЈ¤Ґ¦§Ё©Є«¬*®Ї°±Ііґµ¶·Ј—є»јЅѕїбвчздецъй'
    + 'клмнопртуфхжигюыэящшьасБВЧЗДЕЦЪЙКЛМНОПРТУФХЖИГЮЫЭЯЩШЬАС';
  cmAnsiToKoi8U: TCodeMatrix = FirstCodes // ver 0.8, ©VEG, 31.10.2003
  + 'ЂЃ‚ѓ„…†‡?‰Љ‹ЊЌЋЏђ‘’“”•–—˜™љ›њќћџ ЎўЈ¤Ґ¦§Ё©Є«¬*®Ї°±Ііґµ¶·Ј—є»јЅѕїбвчздецъй'
    + 'клмнопртуфхжигюыэящшьасБВЧЗДЕЦЪЙКЛМНОПРТУФХЖИГЮЫЭЯЩШЬАС';
  cmKoi8RToAnsi: TCodeMatrix = FirstCodes // ver 1.0, ©VEG, 31.10.2003
  + '-¦-¬L-++T++---¦¦---?¦•v??? ?°?·?=¦-ёг㬬¬LLL---¦¦¦¦Ё¦¦TTT¦¦¦+++©юабцдефгх'
    + 'ийклмнопярстужвьызшэщчъЮАБЦДЕФГХИЙКЛМНОПЯРСТУЖВЬЫЗШЭЩЧЪ';
  cmKoi8UToAnsi: TCodeMatrix = FirstCodes // ver 1.0, ©VEG, 31.10.2003
  + '-¦-¬L-++T++---¦¦---?¦•v??? ?°?·?=¦-ёєгії¬LLL-ґў¦¦¦¦ЁЄ¦ІЇT¦¦¦+ҐЎ©юабцдефгх'
    + 'ийклмнопярстужвьызшэщчъЮАБЦДЕФГХИЙКЛМНОПЯРСТУЖВЬЫЗШЭЩЧЪ';
  cmOemDosToAnsi: TCodeMatrix = FirstCodes // ver 1.0, ©VEG, 31.10.2003
  + 'АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмноп---¦+¦¦¬¬¦¦¬---¬L+T+-+¦¦L'
    + 'г¦T¦=+¦¦TTLL-г++----¦¦-рстуфхцчшщъыьэюяЁёЄєЇїЎў°•·v№¤¦ ';
  cmIsoToAnsi: TCodeMatrix = FirstCodes // ver 1.0, ©VEG, 31.10.2003
  + '????????????????????????˜??????? ЁЂЃЄЅІЇЈЉЊЋЌ*ЎЏАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШ'
    + 'ЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя№ёђѓєѕіїјљњћќ§ўџ';

function ConvertEncoding(sIn: string; sCoding: string): string;
//sIn - строка для перекодирования
//sCoding - матрица для перекодирования
//result - полученная перекодированная строка
var
  iFtd: integer;
begin
  for iFtd := 1 to length(sIn) do
    result := result + sCoding[ord(sIn[iFtd])];
end; // ver 1.0, (C)Vrublevsky Evgeny Gennadyevich (BELARUS/SLUTSK), 31.10.2003
Пример использования: 

var
  sOut: string;
begin
  sOut := ConvertEncoding(ConvertEncoding('Тест!', cmAnsiToKoi8R), cmKoi8RToAnsi);
end;
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Старый 25.10.2007, 10:59   #5
Uomo
Пользователь
 
Регистрация: 24.10.2007
Сообщений: 19
По умолчанию

Я все таки не соглашусь что мне подходит это решение с перекодировкой. Потому что полученный файл не читается какой либо из кодировок.
Uomo вне форума Ответить с цитированием
Старый 25.10.2007, 16:31   #6
Uomo
Пользователь
 
Регистрация: 24.10.2007
Сообщений: 19
По умолчанию

Сделал запись в файл таким образом:
Код:
procedure TFindText.Button5Click(Sender: TObject);
var
haystack : String;
bufstr: String;
myFile: File of Word;
my: File of Word;
fil: TFileStream;
po: integer;
p: String;
posit: integer;
Writer1: TWriter;
begin
 f:= TStringList.Create();
 f.LoadFromFile('d:\log.txt');
 j:= 0;
 posit := 0;
for i:=0 to f.Count-1 do
 begin
  haystack:= f.Strings[I];
  po:= Pos('Sum', haystack) + 5;
  if Pos('Sum',haystack) = 0 then
    j:= 1
  else
   begin
    bufstr:= Copy(haystack, po, 7);
    fil:= TFileStream.Create('d:\log1.txt', fmCreate or fmOpenWrite);
    Writer1 := TWriter.Create (fil, $FF);
//    Writer1.Position := posit;
//    Writer1.WriteString(bufstr);
    Writer1.WriteStr(bufstr);
    ShowMessage(bufstr);
     Application.MessageBox('Строка найдена',
    'Запись удачно записана в файл', MB_OKCANCEL);
    Writer1.Free;
    fil.Free;
   end;
 end;
 if j= 1 then
   Application.MessageBox('Строк больше не найдено',
   'Поиск закончен', MB_OKCANCEL);
end;
Может кому нибудь пригодится.
Uomo вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сохранение в текстовый файл Askat Общие вопросы Delphi 11 26.02.2008 14:47
Сохранение массива в файл Artem Общие вопросы Delphi 10 11.12.2007 20:00
Сохранение в *.Bmp - файл Рустам Мультимедиа в Delphi 14 28.11.2007 21:32
Сохранение в файл Македонский Общие вопросы Delphi 4 05.09.2007 15:04
Сохранение в файл *.*С Noor Общие вопросы C/C++ 6 08.01.2007 22:44