Функции и Графики ПРОГРАММИРОВАНИЕ на C++ / Turbo Pascal

ФУНКЦИИ
и ГРАФИКИ

ЭЛЕМЕНТАРНЫЕ ФУНКЦИИ
ГРАФИКИ
ТЕСТЫ
КОНТАКТЫ
КАРТА САЙТА
НА ГЛАВНУЮ

NEW !!!

ПРОГРАММИРОВАНИЕ
TURBO PASCAL
C++
ПРОВЕРЬ СВОИ ЗНАНИЯ!
ЛАБОРАТОРНАЯ №5 ВАРИАНТ 6
Задача: Открыть заданный текстовый файл и записать все его строки в двоичный файл записей переменной длины (каждая строка записывается в виде записи из двух полей [длина][содержимое]). После чего необходимо открыть созданный файл и вывести его содержимое на экран. Имя входного (текстового) файла задается в виде аргумента командной строки. Имя выходного (двоичного) файла генерируется программой: он должен иметь то же имя, что и входной, но другое расширение - “.bin” Запись двоичного файла и его чтение реализовать в виде отдельных функций.
>>Скачать<<
Решение:
//---------------------------------------------------------------------------
#include < stdio.h>
#include < stdlib.h>
#include < string.h>
#define count 5
#define SIGN "VARIANT3.0"
struct STROKA
{
      int len; //Длина строки
      char str[256];
}DATA;
//---------------------------------------------------------------------------
int CreateFile(char FNAME[256])
{ //Функция копирования содержимого текстового файла в двоичный
      FILE *input = fopen(FNAME,"rt");
      FILE *output = fopen("DATA.bin","w");
      if(!input || !output) return 0;
      else
      {
      //Запись сигнатуры
      int slen = strlen(SIGN) + 1;
      if(fwrite(SIGN,sizeof(char),slen,output) != slen)
      {
        fclose(output);
        output = NULL;
      }
      }
      int i = 0;
      while(fgets(DATA.str,256,input) != NULL) //Копирование содержимого файла
      {
        printf("%s",DATA.str); //Вывод строки на экран
        DATA.len = strlen(DATA.str);
        fwrite(&DATA,sizeof(DATA),1,output); //Запись структуры в файл
        i++; //Счётчик записей (строк)
      }
      fwrite(&i,sizeof(int),1,output); //Запись счётчика строк в файл
      fclose(input); //Закрытие файлов
      fclose(output);
      return 1;
}

//---------------------------------------------------------------------------
int OpenFile(char FNAME[256]) //Функция чтения из двоичного файла "DATA.bin"
{
      FILE *fd = fopen(FNAME,"r"); //Открытие файла
      if(fd) //Проверка сигнатуры
      {
        int slen = strlen(SIGN) + 1;
        char buf[32]; //Проверка сигнатуры
        if(fread(buf,sizeof(char),slen,fd) != slen)
        {
          printf("READING ERROR!!!\n");
          fclose(fd);
          fd = NULL;
        }
        else
        if(strcmp(buf,SIGN) != 0)
        {
          printf("FORMAT ERROR!!!\n");
          fclose(fd);
          fd = NULL;
        }
      else
      {
      //Если все проверки пройдены...
      int nmax = 0; //Количество записей в файле (находится в конце файла)
      fseek(fd,-sizeof(int),SEEK_END); //Перемещение в конец файла
      fread(&nmax,sizeof(int),1,fd);
      fseek(fd,slen,SEEK_SET); //Перемещение в начало (позиция после сигнатуры)

      int i = 0;
      while(i != nmax) //Цикл чтения
      {
        fread(&DATA,sizeof(DATA),1,fd);
        printf("%s",DATA.str);
        i++;
      }

      fclose(fd); //Закрытие файла
      return 1;
      }
      }

}
//---------------------------------------------------------------------------
int main(int argc, char* argv[])
{
      if(!CreateFile(argv[1])) puts("UNABLE TO CREATE NEW FILE!!!");
      else puts("\n WRITING: OK!\n");
      if(!OpenFile("DATA.bin")) puts("UNABLE TO OPEN FILE!!!");
      else puts("\n READING: OK!\n");

      system("PAUSE");
}
//---------------------------------------------------------------------------

Используются технологии uCoz