| 
| 
 | Вопрос # 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 dowriteln(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 doTemp.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]:как говорят в одной рекламе, "зачем платить больше?" В данном случае код написан, нам только нужно подставить пару строк. Я понимаю идусов, им платят за кол-во строк кода. Но мы же пытаемся делать красивый код.
 
 С другой стороны, стараться "оптимизировать библиотечный код" обычно нужно только в том случае, когда понимаешь, что в данной задаче он тормозит или явно с ошибками.
 Галочка "подтверждения прочтения" - вселенское зло. |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |