|
Вопрос # 5 450/ вопрос открыт / |
|
Приветствую, уважаемые эксперты!
Подскажите пожалуйста.
Например пишем в memo1 текст "111" нажимаем кнопку добавить и в текстовый файл добавляется "111", Далее с memo1 удаляем текст и пишем новый текст ''222'' и снова нажимаем кнопку добавить и так же в файл добавляется текст. Но вот в чем вопрос. Строки в файл добавляются через пробел!!!
вот так:
111
222
Как мне сделать что бы этих пробелов не было, что бы текст добавлялся в файл так:
111
222
Приложение: Переключить в обычный режим-
-
- var
-
- f: TextFile;
- fName: String;
- i: integer;
- begin
-
- fName := '1.txt';
- AssignFile(f, fName);
- Append(f);
- for i:= 0 to Memo1.Lines.Count do
- writeln(f, Memo1.Lines[i]);
- CloseFile(f);
 |
Вопрос задал: Генка (статус: Посетитель)
Вопрос отправлен: 27 июня 2011, 00:15
Состояние вопроса: открыт, ответов: 1.
|
Ответ #1. Отвечает эксперт: Gooddy
Здравствуйте, Генка!
Меняем
WriteLn(...)
на
Write(...)
 |
Ответ отправил: Gooddy (статус: 3-ий класс)
Время отправки: 27 июня 2011, 00:25
|
Мини-форум вопроса
Всего сообщений: 15; последнее сообщение — 27 июня 2011, 12:11; участников в обсуждении: 5.
|
Генка (статус: Посетитель), 27 июня 2011, 00:40 [#1]:
Но теперь всё пишется в одну строку 111222 а не в столбик
|
|
Gooddy (статус: 3-ий класс), 27 июня 2011, 00:41 [#2]:
Окей
Write( xxx + #10#13 )
Чисти код! Чисти код! Чисти код!
|
|
Gooddy (статус: 3-ий класс), 27 июня 2011, 00:42 [#3]:
А стой. Нашёл у тя ошибку.
for i:= 0 to Memo1.Lines.Count do
Замени на
for i:= 0 to Memo1.Lines.Count-1 do
Чисти код! Чисти код! Чисти код!
|
|
Генка (статус: Посетитель), 27 июня 2011, 00:45 [#4]:
Спасибо огромное!!! Всё получилось!!
|
|
Gooddy (статус: 3-ий класс), 27 июня 2011, 00:45 [#5]:
Странно что при записи ошибок не было. По всем правилам там был выход за границы массива.
Чисти код! Чисти код! Чисти код!
|
|
Gooddy (статус: 3-ий класс), 27 июня 2011, 00:47 [#6]:
Генка: попробуй поставить там энтеров сам, они всё равно напишутся! Лучше используй такой код:
for i:= 0 to Memo1.Lines.Count-1 do
if trim(Memo1.Lines[i])<>'' then
writeln(f, Memo1.Lines[i]);
Он проверяет не является ли строка пустой, и лишь затем добавляет.
Чисти код! Чисти код! Чисти код!
|
|
Генка (статус: Посетитель), 27 июня 2011, 00:51 [#7]:
Gooddy поставил. Все работает=)Еще раз благодарю.
|
|
Gooddy (статус: 3-ий класс), 27 июня 2011, 00:52 [#8]:
Незачто)
Чисти код! Чисти код! Чисти код!
|
|
min@y™ (статус: Доктор наук), 27 июня 2011, 08:17 [#9]:
Забудьте уже вы паскалевские функции работы с файлами! Они устарели 100500 лет назад. Предложу свой вариант с обработчиком ошибок:
const
FileName = '1.txt';
var
Temp: TStringList;
begin
Temp:= TStringList.Create();
try
try
Temp.LoadFromFile(FileName);
Temp.AddStrings(Memo1.Lines);
Temp.SaveToFile(FileName);
except
Application.MessageBox(PChar('Ошибка ввода/вывода.'),
PChar('Ошибка'),
mb_Ok + mb_IconError);
end;
finally
Temp.Free();
end;
end;
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Вадим К (статус: Академик), 27 июня 2011, 11:24 [#10]:
Очень ужасный код. Представим на секундочку, что файл размером в сотни метров. Такой код долго будет работать с файлом.
Лично я за такой код, если он промышленный, ставлю неуд.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
bugmenot (статус: 3-ий класс), 27 июня 2011, 11:40 [#11]:
Цитата (Вадим К):
Представим на секундочку, что файл размером в сотни метров.
И внутри дефолтной реализации LoadFromFile/SaveToFile это число удвоится за счёт буфера. По уму надо вместо стандартного I/O надо бы использовать TTextReader/Writer.
виконання програми розпочинається з того самого мiсця, де призупинилося.
|
|
min@y™ (статус: Доктор наук), 27 июня 2011, 11:41 [#12]:
Цитата (Вадим К):
Очень ужасный код. Представим на секундочку, что файл размером в сотни метров. Такой код долго будет работать с файлом. Лично я за такой код, если он промышленный, ставлю неуд.
Ойойой, какие мы привередливые! После критики мог бы и свой вариант предложить.
const
FileName = '1.txt';
var
Temp: TFileStream;
Index: Integer;
Buffer: string;
begin
if Memo1.Lines.Count = 0
then Exit;
Temp:= TFileStream.Create(FileName, fmOpenWrite or fmShareExclusive);
try
try
Temp.Position:= Temp.Size;
for Index:= 0 to Memo1.Lines.Count - 1 do
begin
S:= Memo1.Lines[Index] + #13#10;
Temp.Write(S[1], Length(S) * SizeOf(Char));
end;
except
Application.MessageBox(PChar('Ошибка ввода/вывода.'),
PChar('Ошибка'),
mb_Ok + mb_IconError);
end;
finally
Temp.Free();
end;
end;
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Вадим К (статус: Академик), 27 июня 2011, 11:48 [#13]:
Цитата (min@y™):
for Index:= 0 to Memo1.Lines.Count - 1 do
Temp.Write(Memo1.Lines[Index][1], Length(Memo1.Lines[Index]) * SizeOf(Char));
Этот цикл тут не нужен. Можно либо сразу весь текст записать, либо просто воспользоваться SaveToStream.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
min@y™ (статус: Доктор наук), 27 июня 2011, 11:54 [#14]:
Цитата (Вадим К):
Этот цикл тут не нужен. Можно либо сразу весь текст записать
Можно, только 1 хрен в TStrings.GetTextStr() будет выполнен цикл, хоть об стенку расшибись!
function TStrings.GetTextStr: string;
var
I, L, Size, Count: Integer;
P: PChar;
S, LB: string;
begin
Count := GetCount;
Size := 0;
LB := sLineBreak;
for I := 0 to Count - 1 do Inc(Size, Length(Get(I)) + Length(LB));
SetString(Result, nil, Size);
P := Pointer(Result);
for I := 0 to Count - 1 do
begin
S := Get(I);
L := Length(S);
if L <> 0 then
begin
System.Move(Pointer(S)^, P^, L);
Inc(P, L);
end;
L := Length(LB);
if L <> 0 then
begin
System.Move(Pointer(LB)^, P^, L);
Inc(P, L);
end;
end;
end;
Цитата (Вадим К):
либо просто воспользоваться SaveToStream.
Монопенисуально:
procedure TStrings.SaveToStream(Stream: TStream);
var
S: string;
begin
S := GetTextStr;
Stream.WriteBuffer(Pointer(S)^, Length(S));
end;
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Вадим К (статус: Академик), 27 июня 2011, 12:11 [#15]:
как говорят в одной рекламе, "зачем платить больше?" В данном случае код написан, нам только нужно подставить пару строк.
Я понимаю идусов, им платят за кол-во строк кода. Но мы же пытаемся делать красивый код.
С другой стороны, стараться "оптимизировать библиотечный код" обычно нужно только в том случае, когда понимаешь, что в данной задаче он тормозит или явно с ошибками.
Галочка "подтверждения прочтения" - вселенское зло.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|