Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 5 450

/ вопрос открыт /

Приветствую, уважаемые эксперты!
Подскажите пожалуйста.

Например пишем в memo1 текст "111" нажимаем кнопку добавить и в текстовый файл добавляется "111", Далее с memo1 удаляем текст и пишем новый текст ''222'' и снова нажимаем кнопку добавить и так же в файл добавляется текст. Но вот в чем вопрос. Строки в файл добавляются через пробел!!!
вот так:

111

222

Как мне сделать что бы этих пробелов не было, что бы текст добавлялся в файл так:

111
222

Приложение:
  1.  
  2.  
  3. var
  4.  
  5. f: TextFile;
  6. fName: String;
  7. i: integer;
  8. begin
  9.  
  10. fName := '1.txt';
  11. AssignFile(f, fName);
  12. Append(f);
  13. for i:= 0 to Memo1.Lines.Count do
  14. writeln(f, Memo1.Lines[i]);
  15. 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

Gooddy (статус: 3-ий класс), 27 июня 2011, 00:41 [#2]:

Окей
Write( xxx + #10#13 )
Чисти код! Чисти код! Чисти код!
Gooddy

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

Gooddy (статус: 3-ий класс), 27 июня 2011, 00:45 [#5]:

Странно что при записи ошибок не было. По всем правилам там был выход за границы массива.
Чисти код! Чисти код! Чисти код!
Gooddy

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

Gooddy (статус: 3-ий класс), 27 июня 2011, 00:52 [#8]:

Незачто)
Чисти код! Чисти код! Чисти код!
min@y™

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

bugmenot (статус: 3-ий класс), 27 июня 2011, 11:40 [#11]:

Цитата (Вадим К):

Представим на секундочку, что файл размером в сотни метров.

И внутри дефолтной реализации LoadFromFile/SaveToFile это число удвоится за счёт буфера. По уму надо вместо стандартного I/O надо бы использовать TTextReader/Writer.
виконання програми розпочинається з того самого мiсця, де призупинилося.

min@y™

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™

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]:

как говорят в одной рекламе, "зачем платить больше?" В данном случае код написан, нам только нужно подставить пару строк.
Я понимаю идусов, им платят за кол-во строк кода. Но мы же пытаемся делать красивый код.

С другой стороны, стараться "оптимизировать библиотечный код" обычно нужно только в том случае, когда понимаешь, что в данной задаче он тормозит или явно с ошибками.
Галочка "подтверждения прочтения" - вселенское зло.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:44
Выполнено за 0.04 сек.