|
|
|
|
ЛАБОРАТОРНАЯ №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
|