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

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

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

NEW !!!

ПРОГРАММИРОВАНИЕ
TURBO PASCAL
C++
ПРОВЕРЬ СВОИ ЗНАНИЯ!
ЛАБОРАТОРНАЯ №5 ВАРИАНТ 3
Задача: Двоичный файл записей фиксированной длины. Написать функции записи в файл с заданным именем массива чисел типа double и чтения из файла числа с заданным номером. Программа должна работать следующим образом: если в командной строке один аргумент (это должно быть имя файла), то вызывается функция записи введенного с клавиатуры массива чисел, если аргументов два ( имя файла и номер числа), то вызывается функция чтения из файла числа с заданным номером и вывод его на экран.
>>Скачать<<
Решение:
//---------------------------------------------------------------------------
#include < stdio.h>
#include < string.h>
#include < stdlib.h>
#define NMAX 100 //Размер массива ARRAY
#define SIGN "VARIANT3.0"

double ARRAY[NMAX];
//---------------------------------------------------------------------------
int vvod(int MAX) //Функция ввода массива с клавиатуры вручную
{
      FILE *fd;
      fd = fopen("DATA.bin","wb");
      if(!fd) return 0;
      else
      {

        //Запись сигнатуры
        int slen = strlen(SIGN) + 1;
        if(fwrite(SIGN,sizeof(char),slen,fd) != slen) fclose(fd);
        char buf[32];
        puts("ENTER DATA:");
        int i = 0;
        while(1) //Ввод элементов массива с клавиатуры
        {
          gets(buf);
          if(strcmp(buf,"") == 0) break; //Если ничего не введено - break
          ARRAY[i] = atof(buf);
          fwrite(&ARRAY[i],sizeof(double),1,fd); //Запись чисел в файл
          i++;
        }
        fwrite(&i,sizeof(int),1,fd); //Запись в файл количества элементов массива

        return 1;
        fclose(fd);
      }

}
//---------------------------------------------------------------------------
double vivodfile(char FNAME[256], int number,int pr) //ВЫВОД ЧИСЛА из файла
{
      FILE *fd = fopen(FNAME,"rb");
      if(fd) //Проверка сигнатуры
      {

        int slen = strlen(SIGN) + 1;
        char buf[32]; //Проверка сигнатуры
        // printf("%d",ftell(fd));
        if(fread(buf,sizeof(char),slen,fd) != slen)
        {
          printf("READING ERROR!!!\n");
          fclose(fd);
        }
        else
        if(strcmp(buf,SIGN) != 0)
        {
          printf("FORMAT ERROR!!!\n");
          fclose(fd);
        }
        else //Если все проверки пройдены...
        {

            double value = 0.0; int max = 0;

            //Чтение из файла размера массива
            fseek(fd,-sizeof(int),SEEK_END); //Перемещение в конец файла
            fread(&max,sizeof(int),1,fd);
            fseek(fd,slen,SEEK_SET); //Перемещение в начало (позиция после сигнатуры)
           

            if(pr == -1) //Вывод на экран всех значений из файла
            {
            for(int i = 0; i!= max; i++)
            {
              fread(&value,sizeof(double),1,fd);
              printf("%1.2lf\n",value);
            }
            return -1;
            }
            else
            {
              if(number > max || number < 0) puts("ERROR! VVEDITE PRAVILNII NOMER!!!");
              else
              {
              fseek(fd,sizeof(double)*number,SEEK_CUR); //Переход к нужному числу
              fread(&value,sizeof(double),1,fd); //Чтение числа
              printf("%1.2lf\n",value); //Вывод на экран
            }
            return(value);
          }
        }
      }
    }
//---------------------------------------------------------------------------
int main(int argc, char* argv[])
{
      if(argc == 2) if(!vvod(NMAX)) printf("UNABLE TO CREATE NEW DATA FILE\n");
      if(argc == 3)
      {
       if(!vivodfile(argv[1],atoi(argv[2]),0))
       printf("UNABLE TO OPEN FILE\n");
      }
      system("PAUSE");
}
//---------------------------------------------------------------------------
Используются технологии uCoz