Непонятные символы в создаваемом файле

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

Ответить
RAJAH
Местный житель
Сообщения: 932
Зарегистрирован: 18 фев 2008, 12:49

Непонятные символы в создаваемом файле

Сообщение RAJAH »

Здравствуйте!
Создаю выгрузку при помощи функций File_OpenFile и File_Write. В результате получаю не совсем то, что хочу записать в файл. Например:

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

001826;                                                                                                                                                                                                                                                        01.06.2010;                                                                                                                                                                                                                                                    
1500.0000;;                                                                                                                                                                                                                                                    0269008334;                                                                                                                                                                                                                                                    40702810706390100519;                                                                                                                                                                                                                                          
048073601;                                                                                                                                                                                                                                                     7740000076;                                                                                                                                                                                                                                                    40702810700000001663;                                                                                                                                                                                                                                          
044525232;                                                                                                                                                                                                                                                     0;                                                                                                                                                                                                                                                             01.06.2010;                                                                                                                                                                                                                                                    ;                                                                                                                                                                                                                                                              NЗА УСЛУГИ СВЯЗИ ПО СЧ. 1 ОТ 01.06.2010Г НДС (18%) 228-81руб, включен в сумму.;                                                                                                                                                                                 ;                                                                                                                                                                                                                                                              
Видны какие-то квадратики и ужасно длинные разрывы. Вот как выглядит, например, в 16-тиричном редакторе (откуда-то первый символ с кодом '07' взялся):

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

07 30 30 31 38 32 34 3B 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0B 30 31 2E 30 36 2E 32 30 31 30 3B 00 00 00 00
Код записи в файл следующий:

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

    f := CreateFileHandle('xxx');
    while papka = '' do
    {
      papka:=GetDirName('Укажите место выгрузки файла');
    }
    papka:=papka+'\';
    maska:=DateToStr(Cur_Date, 'DD')+DateToStr(Cur_Date, 'MM')+DateToStr(Cur_Date, 'YY');
    num:='01';
    File_OpenFile(papka+maska+num+'sb.333', stCreate, f);
    DeleteFileHandle(f);
    f := CreateFileHandle('xxx');
    File_OpenFile(papka+maska+num+'sb.333', stOpenWrite, f);
    ndok:='';
    innplat:='';
    rsplat:='';
    bikplat:='';
    innpol:='';
    rspol:='';
    bikpol:='';
    vidpl:='';
    ocher:='';
    nazn:='';
    _loop
    {
      ndok:=Oem2Ansi(replace(basefin.nodoc, ';', '!'));
      File_Write(ndok+';', f);
      File_Write(DateToStr(plpor.datvip, 'DD.MM.YYYY')+';', f);
      File_Write(DoubleToStr(soprhoz.summa, '\4p666666666666666.8888')+';', f);
      innplat:=Oem2Ansi(replace(katorgplat.unn, ';', '!'));
      File_Write(innplat+';', f);
      rsplat:=Oem2Ansi(replace(katbankplat.schet1, ';', '!'));
      File_Write(rsplat+';', f);
      bikplat:=Oem2Ansi(replace(katbankplat.mfo1, ';', '!'));
      File_Write(bikplat+';', f);
      innpol:=Oem2Ansi(replace(katorg.unn, ';', '!'));
      File_Write(innpol+';', f);
      rspol:=Oem2Ansi(replace(katbank.schet1, ';', '!'));
      File_Write(rspol+';', f);
      bikpol:=Oem2Ansi(replace(katbank.mfo1, ';', '!'));
      File_Write(bikpol+';', f);
      vidpl:=plpor.telepost;
      File_Write(vidpl+';', f);
      File_Write(DateToStr(plpor.datob, 'DD.MM.YYYY')+';', f);
      if length(plpor.kodnew) > 0 then
        if length(plpor.kodnew) > 2 then
          ocher:=Oem2Ansi(replace(substr(plpor.kodnew, length(plpor.kodnew)-1, 2), ';', '!'))
        else
          ocher:=Oem2Ansi(replace(plpor.kodnew, ';', '!'))
      else
        ocher:='';
      File_Write(ocher+';', f);
      nazn:=Oem2Ansi(replace(plpor.namepl1+plpor.namepl2+plpor.namepl3+plpor.namepl4, ';', '!'));
      File_Write(nazn+';', f);
      File_Write(kodst+';', f);
      File_WriteLn(prizn, f);
    }
    File_Close(f);
    DeleteFileHandle(f);
Как надо правильно организовать выгрузку в файл?
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5187
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: Непонятные символы в создаваемом файле

Сообщение edward_K »

1. Не понятно зачем 2 раза открывать файл
2. file ?? не хотите попробовать? код будет чуть наглядней
3. Мне кажется тут основная проблема с writeln - замените ее на fh.Write(chr(13) + chr(10)). Вроде как нельзя мешать write и writeln при выводе.
Иван
Местный житель
Сообщения: 200
Зарегистрирован: 28 апр 2009, 13:19
Откуда: Новороссийск

Re: Непонятные символы в создаваемом файле

Сообщение Иван »

может тут как в стандартной библиотеке си, есть бинарный режим вывода в файл, а есть текстовый)
RAJAH
Местный житель
Сообщения: 932
Зарегистрирован: 18 фев 2008, 12:49

Re: Непонятные символы в создаваемом файле

Сообщение RAJAH »

edward_K писал(а):1. Не понятно зачем 2 раза открывать файл
Первый раз - создание, второй - открытие. Как надо-то?
edward_K писал(а):2. file ?? не хотите попробовать? код будет чуть наглядней
Можно поподробнее?
edward_K писал(а):3. Мне кажется тут основная проблема с writeln - замените ее на fh.Write(chr(13) + chr(10)). Вроде как нельзя мешать write и writeln при выводе.
По-моему, тут с самого начала проблема, когда вставляется первым символом chr(7), т.е. 001826 вместо 001826, а не в конце при writeln.
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5187
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: Непонятные символы в создаваемом файле

Сообщение edward_K »

а вы попробуйте сначала
file можно в фейсе
где то верху
file fh;
fh.OpenFile(sfilenm, stCreate); - это уже открыли по записи
fh.write('dddd') и так далее.
RAJAH
Местный житель
Сообщения: 932
Зарегистрирован: 18 фев 2008, 12:49

Re: Непонятные символы в создаваемом файле

Сообщение RAJAH »

Так?

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

File gfFile;

...

    f := gfFile.Handle;
    while papka = '' do
    {
      papka:=GetDirName('Укажите место выгрузки файла');
    }
    papka:=papka+'\';
    maska:=DateToStr(Cur_Date, 'DD')+DateToStr(Cur_Date, 'MM')+DateToStr(Cur_Date, 'YY');
    num:='01';
    gfFile.OpenFile(papka+maska+num+'sb.333', stCreate);
    _loop
    {
      ndok:=oem2ansi(replace(basefin.nodoc, ';', '!'));
      gfFile.Write(ndok+';');
      gfFile.Write(DateToStr(plpor.datvip, 'dd.mm.yyyy')+';');
      gfFile.Write(DoubleToStr(soprhoz.summa, '\4p666666666666666.8888')+';');
      innplat:=oem2ansi(replace(katorgplat.unn, ';', '!'));
      gfFile.Write(innplat+';');
      rsplat:=oem2ansi(replace(katbankplat.schet1, ';', '!'));
      gfFile.Write(rsplat+';');
      bikplat:=oem2ansi(replace(katbankplat.mfo1, ';', '!'));
      gfFile.Write(bikplat+';');
      innpol:=oem2ansi(replace(katorg.unn, ';', '!'));
      gfFile.Write(innpol+';');
      rspol:=oem2ansi(replace(katbank.schet1, ';', '!'));
      gfFile.Write(rspol+';');
      bikpol:=oem2ansi(replace(katbank.mfo1, ';', '!'));
      gfFile.Write(bikpol+';');
      vidpl:=plpor.telepost;
      gfFile.Write(vidpl+';');
      gfFile.Write(DateToStr(plpor.datob, 'dd.mm.yyyy')+';');
      if length(plpor.kodnew) > 0 then
        if length(plpor.kodnew) > 2 then
          ocher:=oem2ansi(replace(substr(plpor.kodnew, length(plpor.kodnew)-1, 2), ';', '!'))
        else
          ocher:=oem2ansi(replace(plpor.kodnew, ';', '!'))
      else
        ocher:='';
      gfFile.Write(ocher+';');
      nazn:=oem2ansi(replace(plpor.namepl1+plpor.namepl2+plpor.namepl3+plpor.namepl4, ';', '!'));
      gfFile.Write(nazn+';');
      gfFile.Write(kodst+';');
      gfFile.WriteLn(prizn);
    }
    gfFile.Close;
То же самое на выходе.
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5187
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: Непонятные символы в создаваемом файле

Сообщение edward_K »

gfFile.WriteLn(prizn); то замените на то что писал, смена формы вывода это не отменяет!.
RAJAH
Местный житель
Сообщения: 932
Зарегистрирован: 18 фев 2008, 12:49

Re: Непонятные символы в создаваемом файле

Сообщение RAJAH »

Теперь нечто вроде

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

                                                                                                                                                                                                                                                            001826;                                                                                                                                                                                                                                                        dd.mm.yyyy;                                                                                                                                                                                                                                                    
1500.0000;;                                                                                                                                                                                                                                                    0269008334;                                                                                                                                                                                                                                                    40702810706390100519;                                                                                                                                                                                                                                          
048073601;                                                                                                                                                                                                                                                     7740000076;                                                                                                                                                                                                                                                    40702810700000001663;                                                                                                                                                                                                                                          
044525232;                                                                                                                                                                                                                                                     0;                                                                                                                                                                                                                                                             dd.mm.yyyy;                                                                                                                                                                                                                                                    ;                                                                                                                                                                                                                                                              NЗА УСЛУГИ СВЯЗИ ПО СЧ. 1 ОТ 01.06.2010Г НДС (18%) 228-81руб, включен в сумму.;                                                                                                                                                                                 ;                                                                                                                                                                                                                                                              0
Думаю, большой разницы нет...
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5187
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: Непонятные символы в создаваемом файле

Сообщение edward_K »

а теперь write меняем на WriteLine
writeln тогда тоже пашет.
Write - у похоже нужно подпихивать только переменные.
RAJAH
Местный житель
Сообщения: 932
Зарегистрирован: 18 фев 2008, 12:49

Re: Непонятные символы в создаваемом файле

Сообщение RAJAH »

О! Благодарю!
Только возникает риторический вопрос: зачем тогда File_Write, <handle>.write и прочие прибамбасы, если правильно использовать WriteLine? И почему в документации про различия в этих операторах и когда какой применять не рассказано?
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5187
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: Непонятные символы в создаваемом файле

Сообщение edward_K »

ну это не ко мне :).
Ged
Местный житель
Сообщения: 645
Зарегистрирован: 29 мар 2005, 17:49
Контактная информация:

Re: Непонятные символы в создаваемом файле

Сообщение Ged »

RAJAH писал(а): И почему в документации про различия в этих операторах и когда какой применять не рассказано?
Вроде в документации все есть.
  • procedure Write (field : anyType);
    procedure File_Write (field : anyType; handle : longInt);
    Процедура записывает в двоичном виде значение поля field в файл с текущей позиции без символа перевода каретки. Функция имеет проверку типа и работает с любым типом поля.
  • procedure WriteLn (field : string);
    procedure File_WriteLn (field : string; handle : longInt);
    Процедура записывает поле field в файл с текущей позиции с символом перевода каретки в конце строки. Функция не имеет проверки типа поля и работает только с полем типа string.
RAJAH
Местный житель
Сообщения: 932
Зарегистрирован: 18 фев 2008, 12:49

Re: Непонятные символы в создаваемом файле

Сообщение RAJAH »

Ged писал(а): Вроде в документации все есть.
  • procedure Write (field : anyType);
    procedure File_Write (field : anyType; handle : longInt);
    Процедура записывает в двоичном виде значение поля field в файл с текущей позиции без символа перевода каретки. Функция имеет проверку типа и работает с любым типом поля.
Вообще-то, мне казалось, что двоичный вид - это нечто вроде "100010101010001011110", а здесь какой-никакой, а вменяемый текст.
Ged писал(а):Функция не имеет проверки типа поля и работает только с полем типа string.
Номера документов, расчётные счета, назначения платежа - самые что ни на есть строки! :)
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5187
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: Непонятные символы в создаваемом файле

Сообщение edward_K »

ну не совсем строки. вот если бы вы выводили переменные, тогда да. Да и то вопрос где будет отсечка - размер то string 255.
Ответить