// Пример 12. Печать в файл и чтение из файла

Primer12()
{
  int type=0; // 0-путь; 1-файл
  int Dist=-1;
  int len=256;

  char Heading[len],
       Path[len]; 
  sprintf(Heading,"Путь для передачи в файл:");
  sprintf(Path,"c:\\%-200.200s","");
  Dist=Panel_Path(Heading,Path,type);
  // если нажали ESC
  if (Dist==27)
  {
    var CurFile=CreateObject("CurPrnFile");
    CurFile.SetFlagBrowse(0);
    return 0;
  }

  var CurFile=CreateObject("CurPrnFile"); // объект для работы с файлом печати
  CurFile.SetFlagBrowse(0); // запрещаем просмотр файла печати

  int hf;                // хэндл создаваемого файла
  char Buffer[len];      // буфер для строки выводимой в файл
  char TmpFileName[len]; // буфер для имени временного файла
  char NameStr[len];     // буфер для имени файла
  char NameStr1[len];    // буфер для имени второго файла
  unsigned long dwBytes;
  FreeSpaceString(Path,3,"");
  sprintf(NameStr,"%s%s", Path, "test.txt"); 
  sprintf(NameStr1,"%s%s", Path, "test1.txt");

  // создадим временный файл в текущей директории
  sprintf(TmpFileName,"test.tmp");
  DeleteFile(TmpFileName);

//if ((stream = CreateFile(name       ,GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_NEW,FILE_ATTRIBUTE_NORMAL,NULL)) == INVALID_HANDLE_VALUE)
  if ((hf  =    CreateFile(TmpFileName,1073741824   ,1              ,0   ,1         ,128                  ,0   )) == -1)
  {
    AmbaMessageBox("невозможно создать файл","ошибка",1,0);
  }

  // создаем объект класса для работы с текущей таблицей
  var CTabl=CreateObject("CurPrnTbl");
  int cr=CTabl.Count_Rcr(); // число рабочих записей в таблице   

  // цикл по записям таблицы
  for (int zap=0; zap<cr; zap++)
  {
    // читаем из таблицы запись 
    sprintf(Buffer,"%7d %-40.40s\r\n",atoi(CTabl.TextS("C_FIO",zap)),CTabl.TextS("FIO",zap)); 
    // пишем в файл
    WriteFile(hf,Buffer,strlen(Buffer),dwBytes,0);
  }

  long FileSize=SetFilePointer(hf,0,0,1); // установив указатель таким образом можно определить размер файла
  CloseHandle(hf); // записали и закрыли

  // читаем файл
  char rBuff[len]; 
  rBuff[1]='\0';
  unsigned long lpNumberOfBytesRead=0;

  // открываем сформированный файл для чтения
  if ((hf=CreateFile(TmpFileName,-2147483648,1,0,3,128,0))==-1)
  {
    AmbaMessageBox("невозможно создать файл","ошибка",1,0);
  }

  int hf1=0; // хэндл второго временного файла
  char TmpFileName1[250]; sprintf(TmpFileName1,"test1.tmp");

  // создаем второй временный файл (открываем для записи)
  if ((hf1=CreateFile(TmpFileName1,1073741824,1,0,1,128,0))==-1)
  {
    AmbaMessageBox("невозможно создать файл","ошибка",1,0);
  }

  string s2;
  long countStr=0;
  char strBuff[len]; for (int i=0; i<len; i++) strBuff[i]=0;

  char myBuffer[len]; 

  while (1)
  {
    ReadFile(hf,rBuff,1,lpNumberOfBytesRead,0);

    sprintf(strBuff,"%s%s",strBuff,rBuff);

    if (rBuff[0]=='\n')
    {
      countStr++;
      s2=static_cast_to_string(countStr);
      AmbaMessageBox(strBuff,"строка - "+s2,1,0);
      // запись во временный файл
      {
        sprintf(Buffer,"%s",strBuff); WriteFile(hf1,Buffer,strlen(Buffer),dwBytes,0);
      }
      for (int i=0; i<len; i++) strBuff[i]=0;
    }

    long FilePointer=SetFilePointer(hf,0,0,1);
    if (FilePointer>=FileSize) break;
  }

  CloseHandle(hf);  // закончили работать с файлами -
  CloseHandle(hf1); // закрываем их

  AmbaMessageBox("число записей = "+s2,"",1,0);

  char RootPathName[20];
  unsigned long SectorsPerCluster=0;
  unsigned long BytesPerSector=0;
  unsigned long NumberOfFreeClusters=0;
  unsigned long TotalNumberOfClusters=0;

  sprintf(RootPathName,"%s",Path); FreeSpaceString(RootPathName,3,"");

  int iDisk=GetDiskFreeSpace(RootPathName,SectorsPerCluster,BytesPerSector,
                             NumberOfFreeClusters,TotalNumberOfClusters);

  double FreeSpace=static_cast_to_double(NumberOfFreeClusters) *
                   static_cast_to_double(SectorsPerCluster) *
                   static_cast_to_double(BytesPerSector);

  if (iDisk==0)
  {
    AmbaMessageBox("устройство не готово\nфайл не будет создан","ошибка",1,0);

    DeleteFile(TmpFileName);
    DeleteFile(TmpFileName1);
  }
  else
  {
    if (FreeSpace<static_cast_to_double(FileSize))
    {
      AmbaMessageBox("на диске недостаточно места\nфайл не будет создан","ошибка",1,0);

      DeleteFile(TmpFileName);
      DeleteFile(TmpFileName1);
    }
    else
    {
      DeleteFile(NameStr);  // удаляем "старые" файлы
      DeleteFile(NameStr1); // если они есть

      // копируем временные файла в те что останутся на диске
      CopyFile(TmpFileName,NameStr,0);   // это файл test.txt - тот в который мы сначала что-то записали, а потом это что-то читали для того чтобы скопировать в другой файл
      CopyFile(TmpFileName1,NameStr1,0); // это файл test1.txt - это тот файл, куда мы скопировали то что записано в файле test

      DeleteFile(TmpFileName);
      DeleteFile(TmpFileName1);
    }
  }
}
