Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Министерство образования и науки Украины
Севастопольский национальный технический университет
Лабораторная работа №3
по теме
«работа с файлами и каталогами»
Выполнил: ст.гр. А-22
Литус И.В.
Проверил:ст. Преподователь
Старинская Д.Н.
Севастополь
2010
Цель Работы
Изучение системных вызовов для работы с файлами.
Постановка задачи
Напишите программу, которая решает задачу вашего варианта из лабораторной работы №2, используя передачу данных через двоичные (не текстовые) файлы.
Для работы с файлами используйте системные вызовы open(), creat(), read(), write(), close().
Задание включает следующие подзадачи, которые должны быть реализованы в виде отдельных функций, вызывающихся с помощью соответствующих опций командной строки:
1) Опция -g: формирование и вывод (на экран и в двоичный файл) 10-15 наборов неупакованных чисел, содержащих информацию о состоянии устройства.
2) Опция -p: чтение данных из файла и упаковка в слова состояния устройства. Вывод полученных упакованных чисел в новый файл и на экран.
3) Опция -u: чтение упакованных слов из файла, распаковка и вывод на экран.
Для хранения данных использовать тип unsigned short (в строке форматирования функций типа printf(), scanf() добавляется префикс h: %hu, %hx, %hd).
Задание
Вариант 9
№разряда |
15 |
14 |
13 |
12 |
11 |
10 |
09 |
08 |
07 |
06 |
05 |
04 |
03 |
02 |
01 |
00 |
Значение |
O |
O |
O |
O |
O |
C |
D |
N |
N |
N |
N |
N |
N |
N |
N |
N |
Схема программы
Pack Unpack Generator
Конец
Схемы подпрограмм
Текст Программы
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#include <fcntl.h>
#define FILERIGHTS 0644
int pack(char*,char*);
int unpack(char*);
void generator(char *, int);
void myerror(char *);
int main(int argc, char * argv[])
{
if (argc < 3|| argc > 4)
{
fprintf(stderr,"ошибка вызова %s\n",argv[0]);
fprintf(stderr,"вызов: \n");
fprintf(stderr,"генерация и запись файла: %s -g целевой_файл количество_наборов_чисел\n",argv[0]);
fprintf(stderr,"чтение данных из файла и упаковка: %s -p исходный_файл\n",argv[0]);
fprintf(stderr,"чтение упакованных данных из файла и распаковка : %s -p исходный_файл\n",argv[0]);
exit(1);
}
else
{
switch(argv[1][1])
{
case 'g': generator(argv[2], atoi(argv[3])); break;
case 'p': pack(argv[2],argv[3]); break;
case 'u': unpack(argv[2]); break;
default : printf("некорректная опция\n");
}
}
return 0;
}
void generator(char * fnameout, int n)
{
int i;
int fdout;
unsigned short mas[4];
int nmas = sizeof mas;
int nw;
if((fdout = creat(fnameout,FILERIGHTS))<0)
{
myerror("generator: ошибка создания файла");
}
for (i=1; i <= n; i++)
{
mas[0] = (unsigned short)rand()%32;
mas[1] = (unsigned short)rand()%2;
mas[2] = (unsigned short)rand()%2;
mas[3] = (unsigned short)rand()%512;
printf("сгенерирован %d-набор:\n",i);
printf("Chislo 1 %hu\n", mas[0]);
printf("Chislo 2 %hu\n", mas[1]);
printf("Chislo 3 %hu\n", mas[2]);
printf("Chislo 4 %hu\n", mas[3]);
if((nw = write(fdout, mas, nmas)) != nmas)
{
myerror("generator: ошибка записи ");
}
}
if ( close(fdout) == -1)
{
myerror("generator: ошибка закрытия файла ");
}
}
int pack(char* fnamein, char* fnameout)
{
int fdin,fdout;
unsigned short mas[4];
int nmas = sizeof mas;
int nr,nw;
int i,c;
int n=5;
unsigned short UnitStateWord[5];
int nmas1 = sizeof UnitStateWord;
if ((fdin = open(fnamein, O_RDWR))<0)
{
myerror("reader: ошибка открытия файла");
}
i = 1;
while ((nr = read(fdin, mas, nmas)) == nmas)
{
UnitStateWord[i]=(mas[0]&0x1F)<<11;
UnitStateWord[i]|=(mas[1]&1)<<10;
UnitStateWord[i]|=(mas[2]&1)<<9;
UnitStateWord[i]|=mas[3]&0x1FF;
printf("Прочитан %d-набор:\n",i);
printf("Chislo 1 %hu\n", mas[0]);
printf("Chislo 2 %hu\n", mas[1]);
printf("Chislo 3 %hu\n", mas[2]);
printf("Chislo 4 %hu\n", mas[3]);
printf("Slovo sostoyaniya %d",UnitStateWord[i]);
i += 1;
}
if (nr < 0)
{
myerror("reader: ошибка чтения");
}
if (close(fdin) == -1)
{
myerror("reader: ошибка закрытия файла");
}
if((fdout = creat(fnameout,FILERIGHTS))<0)
{
myerror("generator: ошибка создания файла");
}
for (i=1;i<n;i++)
{
if((nw = write(fdout, UnitStateWord, nmas1)) != nmas1)
{
myerror("generator: ошибка записи ");
}
}
if ( close(fdout) == -1)
{
myerror("generator: ошибка закрытия файла ");
}
}
int unpack(char* fnamein)
{
int fdout;
unsigned short mas[4];
unsigned short UnitStateWord[5]
int nmas = sizeof mas;
int nr;
int i,c;
int nmas1=sizeof UnitStateWord;
if ((fdin = open(fnamein, O_RDONLY))<0)
{
myerror("reader: ошибка открытия файла");
}
i = 1;
while ((nr = read(fdin, UnitStateWord, nmas)) == nmas)
{
mas[0]=(UnitStateWord[i]>>11)&0x1F;
mas[1] =(UnitStateWord[i]>>10)&1;
mas[2]=(UnitStateWord[i]>>9)&1;
mas[3]=UnitStateWord[i]&0x1FF;
printf("Nabor %d:\n",i);
printf("Chislo 1 %hu\n", mas[0]);
printf("Chislo 2 %hu\n", mas[1]);
printf("Chislo 3 %hu\n", mas[2]);
printf("Chislo 4 %hu\n", mas[3]);
i += 1;
}
if (nr < 0)
{
myerror("reader: ошибка чтения");
}
if (close(fdin) == -1)
{
myerror("reader: ошибка закрытия файла");
}
}
void myerror(char * st)
{
perror(st);
exit(1);
}
Результаты работы программы
Сгенерирован 1 набор:
Chislo 1 = 23
Chislo 2= 1
Chislo 3 = 0
Chislo 4 = 234
Slovo sostoyaniya 9d24
…..
Сгенерирован 5 набор:
Chislo 1 = 12
Chislo 2= 0
Chislo 3 = 1
Chislo 4 = 172
Slovo sostoyaniya 23g5
ВЫВОД
Приобрел навыки работы с с файлами и каталогами в компиляторе gcc. Изучил поразрядных операций языка С. Освоил метод упаковывания чисел в 16-ричное число.