Как сохранить текст из Memo в файл, но без служебных символов
Например, есть уже заполненное поле Memo. Как сохранить из него данные в файл, но без служебных символов (табуляция, перенос строки и т.д.)
ifstream в бинарном режиме и удаляя те символы, которые тебе не нужны.
Не понятно правда зачем это надо
например используя файловые потоки -
Не понятно правда зачем это надо
Мне это надо затем, что сохраняется все в Word'овский файл, а там переносы строк txt-шные мне не нужны...
другой путь состоит в том, чтобы удалить или заменить все специальные символы прямо в Memo и только после этого сохранять стандартными методами. Переприсвоить тексту Memo обработанный исходный текст.
Код:
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;
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;
Цитата: Meander
другой путь состоит в том, чтобы удалить или заменить все специальные символы прямо в Memo и только после этого сохранять стандартными методами. Переприсвоить тексту Memo обработанный исходный текст.
Не получится. В исходниках смотрите: там TStrings.SaveToStream при помощи GetTextStr собирает Items в поток, разделяя их #13#10 как раз.
Код:
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");
}
{
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");
}
Код:
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;
}
{
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;
}
Цитата: BlGhost
Мне это надо затем, что сохраняется все в Word'овский файл, а там переносы строк txt-шные мне не нужны...
ну так может лучше тогда сразу сохранять файл в формате либо Word либо в открытом формате документов - чем заниматься подобными извращениями?
Цитата: kot_
ну так может лучше тогда сразу сохранять файл в формате либо Word либо в открытом формате документов - чем заниматься подобными извращениями?
не будет ли для ТС это большим геммороем?
iscntrl - функция проверяющая наличие любого управляющего символа в диапазоне между нулем и 0x1F или равно 0x7F (символ DEL). но можно написать свою функцию, в которой определить ненужные символы ( \t \n \r и т.д.)
Ещё как вариант можно просто "построчно" из TMemo->Lines складывать триммленные значения в новую строку, которую потом вывести в TFileStream. Trim() удаляет все пробельные символы в начале и в конце строки.
Цитата: Meander
Цитата: kot_
ну так может лучше тогда сразу сохранять файл в формате либо Word либо в открытом формате документов - чем заниматься подобными извращениями?
не будет ли для ТС это большим геммороем?
ну это пусть он сам решает. Как показывает мой опыт - именно такой подход создает гораздо больше проблем в дальнейшем.