AssignFile есть проблема

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

AssignFile есть проблема

Сообщение DiZeLProger » 20.11.2017 21:24:01

Доброго времени!

Случилась интересная вещь...
Каждый раз при запуске моего приложения, программа должна пересоздать 1 файлик в системе. Написал код с использованием AssignFile, в принципе всё работает, файлик пересоздаётся, инфа в файле верная, но файл оказался не того формата который нужно!!!(обнаружил случайно).
Файл получился в формате Mac, а мне нужно чтоб он был в стандартном для unix систем формате. Сейчас чтобы это сделать мне приходится открывать его через nano и пересохранять.

Форумчане, внимание вопрос!
Как сделать так чтоб файл сохранялся в нужном формате?

З.Ы.
ОС: Linux
Дистр: Debian9
Lazarus: 1.6.2
FPC: 3.0.0
DiZeLProger
незнакомец
 
Сообщения: 8
Зарегистрирован: 29.05.2017 08:41:32

Re: AssignFile есть проблема

Сообщение LearnMagic » 20.11.2017 22:07:59

Отсутствует часть необходимой информации
1. Файл текстовый или бинарный
2. Каким образом осуществляется запись.

Мой хрустальный шар, подсказывает, что нужно сформировать строку в соотвествующем формате и записать её. При необходимости в начале файла добавить сигнатуру
BOM - маркер последовательнсти байтов
LearnMagic
новенький
 
Сообщения: 66
Зарегистрирован: 10.11.2016 23:13:38

Re: AssignFile есть проблема

Сообщение DiZeLProger » 20.11.2017 22:22:53

LearnMagic
Файл текстовый.
Код: Выделить всё
...
// формирование инфы файла
...
  AssignFile(f, ПУТЬ);
  {$I-}
  rewrite(f);
  {$I+}
  if IOResult<>0 then
    exit;
  Write(f, ИНФА);
  CloseFile(f)


Всё просто и без наворотов
DiZeLProger
незнакомец
 
Сообщения: 8
Зарегистрирован: 29.05.2017 08:41:32

Re: AssignFile есть проблема

Сообщение Ichthyander » 21.11.2017 00:00:01

В вашем коде символы переноса строка внутри переменной/переменных "ИНФА". Поэтому все равно инфы мало.
Либо может надо было записать так?
WriteLn(f, ИНФА);

В таком виде программа будет делать переносы строка в нужном формате для данной ОС
Аватара пользователя
Ichthyander
энтузиаст
 
Сообщения: 668
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

Re: AssignFile есть проблема

Сообщение DiZeLProger » 21.11.2017 10:56:40

Ichthyander писал(а):WriteLn(f, ИНФА);

В таком виде программа будет делать переносы строка в нужном формате для данной ОС


Разбил инфу по строкам и записывал в файл через WriteLn, не помогло, но потом вернул как было и вместо символа #13 поставил #13#10 (вспомнил про CRLF), тоже не помогло, в итоге оставил только #10 и всё стало гуд!!!
Мне интересно, в какой доке об этом написано!

Ichthyander спасибо за указание направления, я бы ещё долго мучился и искал в чём трабла.

Кстати пробовал создавать файл используя StringList, тоже не помогло.

З.Ы.
Файл состоит в 90% из констант, остальные 10 берутся из ini файла
DiZeLProger
незнакомец
 
Сообщения: 8
Зарегистрирован: 29.05.2017 08:41:32

Re: AssignFile есть проблема

Сообщение Ichthyander » 21.11.2017 11:55:45

Если приходится вкладывать перенос строки в строковую переменную, я всегда использую константу LineEnding, в остальных случаях, правильная записать переносов строк ложится на компоненты (TStringList и т.д.). Странно, откуда и почему у Вас с переносами вдруг проблемы стали появляться
Аватара пользователя
Ichthyander
энтузиаст
 
Сообщения: 668
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

Re: AssignFile есть проблема

Сообщение DiZeLProger » 21.11.2017 13:17:27

LineEnding = #10, я и забыл про эту константу.
DiZeLProger
незнакомец
 
Сообщения: 8
Зарегистрирован: 29.05.2017 08:41:32

Re: AssignFile есть проблема

Сообщение LearnMagic » 21.11.2017 14:04:59

DiZeLProger писал(а):...Мне интересно, в какой доке об этом написано!

http://wiki.freepascal.org/End_of_Line
DiZeLProger писал(а):Файл состоит в 90% из констант, остальные 10 берутся из ini файла

С этого места подробнее: кодировка констант и ini файла
LearnMagic
новенький
 
Сообщения: 66
Зарегистрирован: 10.11.2016 23:13:38

Re: AssignFile есть проблема

Сообщение Ichthyander » 21.11.2017 15:36:43

DiZeLProger писал(а):LineEnding = #10, я и забыл про эту константу.

Точнее при компиляции в Windows #10#13, в Linux #10.
Аватара пользователя
Ichthyander
энтузиаст
 
Сообщения: 668
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

Re: AssignFile есть проблема

Сообщение tema » 22.11.2017 02:14:59

А почему именно так файл писать? Такой вариант не подходит? Тут всё учитывается автоматически...
Код: Выделить всё
program StrList;
{$mode objfpc}
uses
Classes, SysUtils;
var
  Str: TStringList;
begin
  Str := TStringList.Create;
  Str.Add('ИНФА');
  Str.SaveToFile(ПУТЬ);

  Str.Free;
end.


Добавлено спустя 2 минуты 44 секунды:
upd
ага вижу уже пробовали...

Добавлено спустя 1 минуту 42 секунды:
Но всё равно можно указать после создания:
Код: Выделить всё
  Str.LineBreak:=нужный код бряка;
tema
постоялец
 
Сообщения: 375
Зарегистрирован: 24.03.2011 20:19:27

Re: AssignFile есть проблема

Сообщение Vadim » 22.11.2017 10:36:42

tema
Вы не поняли, у человека ИНФА - это не набор символов, а сборка различных данных, внутри которой стоят неверные символы переноса строки. Оттого и все проблемы были.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 36

Рейтинг@Mail.ru