Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.03.2010, 17:52   #1
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию 2 лишних байта при построковой перезаписи

Код:
Type 
 TCList = Array of ShortString;

 TCode = Record
   FileName : ShortString;
   FileData : TextFile;
   CodeList : TCList;
 End;

Var
 Code : TCode;
 F2 : TextFile;
 N:Integer;
Begin
 Code.FileName := ParamStr(1);
 AssignFile(Code.FileData, Code.FileName);
 Reset(Code.FileData);
 SetLength(Code.CodeList, 0);
 While Not Eof(Code.FileData) Do
  Begin
   SetLength(Code.CodeList, Length(Code.CodeList) + 1);
   ReadLn(Code.FileData, Code.CodeList[Length(Code.CodeList) - 1]);
  End;
 CloseFile(Code.FileData);
 AssignFile(F2, Code.FileName +'.txt');
 Rewrite(F2);
 For N:=1 to Length(Code.CodeList) do
  WriteLn(F2,Code.CodeList[N-1]);
 CloseFile(f2);
End.
Входящий - 112 байт,
Исходящий - 114 байт.

Вопрос: с какого?
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 20.03.2010, 17:56   #2
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

С такого)))
Цитата:
Код:
WriteLn(F2,Code.CodeList[N-1]);
psycho-coder вне форума Ответить с цитированием
Старый 20.03.2010, 18:03   #3
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Теперь все идет в одну строку и весит 106
Хотя ладно, причину установил.
Тему в клоуз.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 20.03.2010, 18:07   #4
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

Сделай проверку
Код:
if N = Length(...) then Write(...)
А проще тупо удалить эти два байта из файла после записи
upd

Или так
Код:
For N:=1 to Length(Code.CodeList) -1 do
  WriteLn(F2,Code.CodeList[N-1]);
Write(F2,Code.CodeList[N]);

Последний раз редактировалось psycho-coder; 20.03.2010 в 18:09.
psycho-coder вне форума Ответить с цитированием
Старый 20.03.2010, 22:26   #5
spamer
Software Developer
Старожил
 
Аватар для spamer
 
Регистрация: 19.12.2008
Сообщений: 2,070
По умолчанию

Цитата:
Хотя ладно, причину установил.
Тему в клоуз.
Дык, так а в чем же хоть причина то была? Интересно ведь
Или это из-за, как сказал psycho-coder :
Код:
WriteLn(F2,Code.CodeList[N-1]);
?
Будь проще и люди к тебе потянутся
spamer вне форума Ответить с цитированием
Старый 20.03.2010, 23:00   #6
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Цитата:
Сообщение от spamer Посмотреть сообщение
Дык, так а в чем же хоть причина то была? Интересно ведь ?
Проблема действительно была в LN. )
write('Привет') = Привет
writeLN('Привет') = Привет#13#10
eoln вне форума Ответить с цитированием
Старый 21.03.2010, 15:48   #7
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

Этот кусок кода переписывает весь текст построчно, а последний вызов WriteLn дописывает текст и переносит строку (#13#10) как написал eoln.
Нужно последнюю запись делать через Write
psycho-coder вне форума Ответить с цитированием
Старый 21.03.2010, 16:52   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от psycho-coder
Нужно последнюю запись делать через Write
я не уверен, что если в конце есть последняя пустая строка, она корректно будет скопирована в новый файл...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 21.03.2010, 18:15   #9
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

Кстати, да. Сейчас попробовал, пустые строки вообще игнорирует.
Это обусловлено тем, что ReadLn и Read копирует строку до знаков переноса (#13#10). так что такой неявный trim))
psycho-coder вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление лишних символов из Memo NSV Общие вопросы Delphi 10 23.11.2012 08:38
Вывод без лишних символов Billy Spleen Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 14 26.01.2010 12:47
Отсеивание лишних строк V@mpir Общие вопросы Delphi 3 08.06.2009 16:35
удаление лишних данных в ячейке mistx Microsoft Office Excel 2 24.02.2009 18:32
взятие старшего и младшего байта Djaconda Общие вопросы Delphi 2 29.09.2008 09:25