Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как сохранить текст из Memo в файл, но без служебных символов

68K
12 декабря 2012 года
BlGhost
24 / / 25.11.2012
Например, есть уже заполненное поле Memo. Как сохранить из него данные в файл, но без служебных символов (табуляция, перенос строки и т.д.)
1
12 декабря 2012 года
kot_
7.3K / / 20.01.2000
например используя файловые потоки - ifstream в бинарном режиме и удаляя те символы, которые тебе не нужны.
Не понятно правда зачем это надо
68K
12 декабря 2012 года
BlGhost
24 / / 25.11.2012
Мне это надо затем, что сохраняется все в Word'овский файл, а там переносы строк txt-шные мне не нужны...
446
12 декабря 2012 года
Meander
487 / / 04.09.2011
другой путь состоит в том, чтобы удалить или заменить все специальные символы прямо в Memo и только после этого сохранять стандартными методами. Переприсвоить тексту Memo обработанный исходный текст.
8
12 декабря 2012 года
mfender
3.5K / / 15.06.2005
я бы сделал как-то так. Рецепт на Delphi, но, думаю, всё понятно


Код:
type
  TMyMemo = class(TMemo)
  private
  public
    procedure SaveToFile(const FileName: string);
  end;

  TForm1 = class(TForm)
    procedure MemoChange(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    FMemo: TMyMemo;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TMyMemo.SaveToFile(const FileName: string);
var
  I, Count: Integer;
  Stream: TStream;
  S: string;
begin
  S := Self.Text;
  Count := Length(Self.Text);
  I := 0;
  while I < Length(S) do
  begin
    if Copy(S, I, 2) = #13#10 then
    begin
      Delete(S, I, 2);
      Insert(' ', S, I);
    end
    else if (Copy(S, I, 1) = #13) or (Copy(S, I, 1) = #10)
      or (Copy(S, I, 1) = #9) then
    begin
      Delete(S, I, 1);
      Insert(' ', S, I);
    end;
    Inc(I);
  end;
  Stream := TFileStream.Create(FileName, fmCreate);
  try
    Stream.WriteBuffer(Pointer(S)^, Length(S));
  finally
    Stream.Free;
  end;
end;

procedure TForm1.MemoChange(Sender: TObject);
begin
  FMemo.SaveToFile('c:\memo.txt');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  FMemo := TMyMemo.Create(Form1);
  FMemo.Parent := Form1;
  FMemo.OnChange := MemoChange;
end;
8
12 декабря 2012 года
mfender
3.5K / / 15.06.2005
Цитата: Meander
другой путь состоит в том, чтобы удалить или заменить все специальные символы прямо в Memo и только после этого сохранять стандартными методами. Переприсвоить тексту Memo обработанный исходный текст.


Не получится. В исходниках смотрите: там TStrings.SaveToStream при помощи GetTextStr собирает Items в поток, разделяя их #13#10 как раз.

446
12 декабря 2012 года
Meander
487 / / 04.09.2011
Вот, что я имел ввиду:

 
Код:
void __fastcall TForm1::N1Click(TObject *Sender)
{
  char *str = Memo1->Lines->GetText();
  for(size_t i=0;i<strlen(str);i++)
    if(iscntrl(str[i])) str[i] = ' ';
  Memo1->Lines->SetText(str);
  Memo1->Lines->SaveToFile("text.txt");
}
446
12 декабря 2012 года
Meander
487 / / 04.09.2011
Но красивее будет так:

 
Код:
void __fastcall TForm1::N1Click(TObject *Sender)
{
  TStringList *sl = new  TStringList();
  char *str = Memo1->Lines->GetText();
  for(size_t i=0;i<strlen(str);i++)
    if(iscntrl(str[i])) str[i] = ' ';
  sl->SetText(str);
  sl->SaveToFile("text.txt");
  delete sl;
}
1
13 декабря 2012 года
kot_
7.3K / / 20.01.2000
Цитата: BlGhost
Мне это надо затем, что сохраняется все в Word'овский файл, а там переносы строк txt-шные мне не нужны...


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

446
13 декабря 2012 года
Meander
487 / / 04.09.2011
Цитата: kot_
ну так может лучше тогда сразу сохранять файл в формате либо Word либо в открытом формате документов - чем заниматься подобными извращениями?


не будет ли для ТС это большим геммороем?

68K
13 декабря 2012 года
BlGhost
24 / / 25.11.2012
Цитата:
 
Код:
if(iscntrl(str[i])) str[i] = '  ';



Разве это признак завершения строки?

446
13 декабря 2012 года
Meander
487 / / 04.09.2011
iscntrl - функция проверяющая наличие любого управляющего символа в диапазоне между нулем и 0x1F или равно 0x7F (символ DEL). но можно написать свою функцию, в которой определить ненужные символы ( \t \n \r и т.д.)
8
13 декабря 2012 года
mfender
3.5K / / 15.06.2005
Ещё как вариант можно просто "построчно" из TMemo->Lines складывать триммленные значения в новую строку, которую потом вывести в TFileStream. Trim() удаляет все пробельные символы в начале и в конце строки.
1
13 декабря 2012 года
kot_
7.3K / / 20.01.2000
Цитата: Meander
Цитата: kot_
ну так может лучше тогда сразу сохранять файл в формате либо Word либо в открытом формате документов - чем заниматься подобными извращениями?


не будет ли для ТС это большим геммороем?


ну это пусть он сам решает. Как показывает мой опыт - именно такой подход создает гораздо больше проблем в дальнейшем.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог