Загрузка...

ЛАБОРАТОРНАЯ РАБОТА 9. РАБОТА С ФАЙЛАМИ


ЦЕЛЬ РАБОТЫ: Изучить возможность сохранения результатов работы программы в файлах на дисках и считывания информации из файла.
1.Порядок выполнения работы
1.1. В любом текстовом редакторе создать небольшой текстовый файл.
1.2. Выполнить программу 1 для вашего файла.
1.3. Выполнить индивидуальное задание.

Текст программы
/* Программа 1.*/ Kопированиe файла:
#include <stdio.h>
int main(void)
{
FILE *in, *out;
char *file1,*file2;
puts(“Copy file “);
gets(file1);
puts(“ to “);
gets(file2);

if ((in = fopen(file1, “rt”)) == NULL) //файл
//открывается для чтения в текстовом режиме
{
fprintf(stderr, “Cannot open input file.\n”); return 1;
}
if ((out = fopen(file2, “wt”)) == NULL) //файл
//открывается для записи в текстовом режиме
{
fprintf(stderr,”Cannot open output file.\n”); return 1;
}
while (!feof(in)) // посимвольное копирование файла fputc(fgetc(in), out);
fclose(in); //закрытие файла
fclose(out);
return 0;
}

ИНДИВИДУАЛЬНЫЕ ЗАДАНИЯ.
1. Дан текстовый файл, содержащий вещественные числа. Определить сумму всех компонент файла и записать ее в конце файла.
2. Дан текстовый файл, содержащий вещественные числа. Определить наибольший и наименьший компонент. Результат записать в новый файл.
3. Дан текстовый файл, содержащий целые числа. Определить коли-чество четных компонент и записать в конец файла.
4. Дан текстовый файл. Создать его копию.
5. Даны два текстовых файла. Слить их в один.
6. Дан текстовый файл. Заменить в нем все прописные буквы на строчные.
7. Дан текстовый файл, содержащий вещественные числа. Определить сумму квадратов компонент и записать ее в конец файла.
8. Дан текстовый файл. Создать новый файл, в котором информация записана в обратном порядке.
9. Дан символьный файл, содержащий информацию в виде : фамилия_и-мя_отчество. Записать эту информацию в другой символьный файл в виде: имя_отчество_фамилия.
10. Дан символьный файл, содержащий информацию в виде : фами-лия_имя_отчество. Записать эту информацию в другой символьный файл в виде: фамилия_и.о.
11. Зашифровать текст, записанный с помощью русских букв и зна-ков препинания по следующему алгоритму: буква а шифруется как буква я, ‘б’ как ‘ю’ и т.д. Полученный текст сохранить в файле на диске.
12. Дан текстовый файл. Подсчитать число вхождений в файл букв а, б, с, д и т.д. и вывести на экран в виде таблицы: а — кол-во б — кол-во и т.д.
13. Дан текстовый файл. Произвести его сжатие за счет удаления лишних пробелов и переводов строки. Полученный текст сохранить в новом файле.
14. Дан файл, содержащий вещественные числа в строке. Создать новый файл и записать в него эти числа в колонку.
2. Содержание отчета.
1. Текст программы индивидуального задания.

3.Вопросы по защите лабораторной работы
1. Как работать со структурой FILE ?
2. Какие существуют стандартные потоки ввода/вывода?
3. Как открыть файл?
4. Как закрыть файл?
5. Ввод/вывод символа (функции).
6. Ввод/вывод строк (функции).
7. Форматированный ввод/вывод (функции).
8. Ввод/вывод записей фиксированной длины (функции).
9. Указатель файла-позиционирование, получение текущего поло-жения (функции).
10. Описать программу 1.

ПРИЛОЖЕНИЕ.
Все ниже изложенные функции, cтруктуры и потоки определены в включаемом файле stdio.h.
1. Структура FILE* — структура управления потоком файлов.
Хранит информацию, связанную с устройством или файлом.
typedef struct {
short level;
unsigned flags;
char fd;
unsigned char hold;
short bsize;
unsigned char *buffer, *curp;
unsigned istemp;
short token;
} FILE;
Стандартные потоки
stdin Стандартный поток ввода
stdout Стандартный поток вывода
stderr Стандартный поток сообщений об ошибках
stdprn Стандартный поток вывода на принтер

2. функции работы с файлами

2.1.FILE *fopen(const char *filename, const char *mode);

Возвращает указатель на структуру FILE, если файл открыт  успешно

иначе NULL.

mode: Type ¦ Meaning

======+==================================

r   ¦ Открыть для чтения (файл должен существовать)

w   ¦ Открыть пустой файл для записи (если файл существует, то его

¦ содержимое теряется)

a   ¦ Открыть для записи в конец файла (добавления); файл создает-

¦ ся, если он не существует

r+  ¦ Открыть для чтения и записи (файл должен существовать)

w+  ¦ Открыть пустой файл для чтения и записи; если файл существу-

¦ ет, его содержимое теряется

а+  ¦ Открыть для чтения и добавления; файл создается, если он не

¦ существует

b   ¦ в двоичной форме

t   ¦ в текстовом режиме

2.2. Закрытие файла: если файл не нужен то его необходимо закрыть

int fclose(FILE *stream);  возвращает 0 если успешно; иначе EOF.

После открытия файла доступ к данным, содержащимся в нем воз-

можен как к потоку символов, строкам, форматированным полям,  за-

писям.

2.3. Ввод.вывод символа:

вывод символа в поток              ввод символа из потока

int fputc(int c, FILE *stream);    int fgetc(FILE *stream);

Чтение производится пока не конец файла.

Функция int feof(FILE *stream) возвращает 0 если не  конец  файла

2.4. Ввод /вывод строк

ввод из потока строки символов

char *fgets(char *s, int n, FILE *stream);

char *s — адрес, куда поместить введенные символы

int n   — размер буфера

вывод в поток строки символов

int fputs(const char *s, FILE *stream);

2.5. Форматированный ввод/вывод:

int fprintf(FILE *stream, const char *format[, argument, …]);

то же, что и printf, но в поток. Если  FILE  *stream == stdout то

полная аналогия с printf.

int fscanf(FILE *stream, const char *format[, address, …]);

то  же  что и scanf, но из потока. Если FILE *stream == stdin  то

полная аналогия с scanf.

2.6. Ввод/вывод  записей фиксированной длины — применяется, если

данные будут использоваться только вашими программами.

вывод:

size_t fwrite(const void *ptr, size_t size, size_t n, FILE *stream);

ввод:

size_t fread(void *ptr, size_t size, size_t n, FILE *stream);

void *ptr    -указатель на буфер

size_t size  -размер элемента

size_t n     -число элементов

FILE *stream -указатель на структуру FILE

Пример: fread(a.b,sizeof(a.b),1,in);

2.7. Позиционирование указателя файла:

int fseek(FILE *stream, long offset, int whence);

long offset — число байтов смещения

whence:                 SEEK_SET == 0  c начала файла

SEEK_CUR == 1  с текущей позиции

SEEK_END == 2  от конца файла

2.8. Получение текущего положения указателя файла:

long ftell(FILE *stream);

Другие функции ввода/вывода описаны в файлах stdio.h и io.h.

Загрузка...