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

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

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

Ответить
DiZeLProger
незнакомец
Сообщения: 8
Зарегистрирован: 29.05.2017 07:41:32

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

Сообщение DiZeLProger »

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

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

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

З.Ы.
ОС: Linux
Дистр: Debian9
Lazarus: 1.6.2
FPC: 3.0.0
LearnMagic
новенький
Сообщения: 66
Зарегистрирован: 10.11.2016 22:13:38

Сообщение LearnMagic »

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

Мой хрустальный шар, подсказывает, что нужно сформировать строку в соотвествующем формате и записать её. При необходимости в начале файла добавить сигнатуру
BOM - маркер последовательнсти байтов
DiZeLProger
незнакомец
Сообщения: 8
Зарегистрирован: 29.05.2017 07:41:32

Сообщение DiZeLProger »

LearnMagic
Файл текстовый.

Код: Выделить всё

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


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

Сообщение Ichthyander »

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

В таком виде программа будет делать переносы строка в нужном формате для данной ОС
DiZeLProger
незнакомец
Сообщения: 8
Зарегистрирован: 29.05.2017 07:41:32

Сообщение DiZeLProger »

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

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


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

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

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

З.Ы.
Файл состоит в 90% из констант, остальные 10 берутся из ini файла
Аватара пользователя
Ichthyander
энтузиаст
Сообщения: 701
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань
Контактная информация:

Сообщение Ichthyander »

Если приходится вкладывать перенос строки в строковую переменную, я всегда использую константу LineEnding, в остальных случаях, правильная записать переносов строк ложится на компоненты (TStringList и т.д.). Странно, откуда и почему у Вас с переносами вдруг проблемы стали появляться
DiZeLProger
незнакомец
Сообщения: 8
Зарегистрирован: 29.05.2017 07:41:32

Сообщение DiZeLProger »

LineEnding = #10, я и забыл про эту константу.
LearnMagic
новенький
Сообщения: 66
Зарегистрирован: 10.11.2016 22:13:38

Сообщение LearnMagic »

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

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

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

Сообщение Ichthyander »

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

Точнее при компиляции в Windows #10#13, в Linux #10.
tema
постоялец
Сообщения: 376
Зарегистрирован: 24.03.2011 19:19:27

Сообщение tema »

А почему именно так файл писать? Такой вариант не подходит? Тут всё учитывается автоматически...

Код: Выделить всё

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:=нужный код бряка;
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

tema
Вы не поняли, у человека ИНФА - это не набор символов, а сборка различных данных, внутри которой стоят неверные символы переноса строки. Оттого и все проблемы были.
Ответить