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


ЛАБОРАТОРНАЯ РАБОТА№ 6

 

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

 

1. Порядок выполнения работы.
1.1. В любом текстовом редакторе создать небольшой текстовый файл.
1.2. Выполнить программу 1 для вашего файла. Проверить результат копирования.
1.3. Выполнить индивидуальное задание.

//Текст программы
// Программа 1. Kопированиe файла:
#include <stdio.h>
int main(void)
{
FILE *in, *out;
char file1[10],file2[10];
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;
}

 
2. Индивидуальные задания

Задание 1.
1.1. Дан текстовый файл, содержащий вещественные числа. Определить сумму всех этих чисел и записать ее в конце файла.
1.2. Дан текстовый файл, содержащий вещественные числа. Определить сумму квад-ратов чисел и записать ее и все числовые данные в новый файл.
1.3. Дан текстовый файл, содержащий вещественные числа. Определить наибольшее и наименьшее число. Результат записать в новый файл.
1.4. Дан текстовый файл, содержащий целые числа. Определить количество четных чисел и записать в конец файла.
1.5. Даны два текстовых файла. Слить их в один в третий.
1.6. Дан текстовый файл. Заменить в нем все прописные буквы на строчные.
1.7. Дан текстовый файл. Создать новый файл, в котором информация записана в об-ратном порядке.
1.8. Дан символьный файл, содержащий информацию в виде: фамилия_имя_отчество. Записать эту информацию в другой символьный файл в виде: имя_отчество_фамилия.
1.9. Дан символьный файл, содержащий информацию в виде: фамилия_имя_отчество. Записать эту информацию в другой символьный файл в виде: фамилия_и.о.
1.10. Зашифровать текст, записанный с помощью русских букв и знаков препинания по следующему алгоритму: буква ‘а’ шифруется как буква ‘я’, ‘б’ как ‘ю’ и т.д. Полученный текст сохранить в файле на диске.
1.11. Дан текстовый файл. Подсчитать число вхождений в тексте букв а, б, с, д. и вы-вести на экран в виде: а — Na б — Nб и т.д.
1.12. Дан текстовый файл. Произвести его сжатие за счет удаления лишних пробелов и переводов строки. Полученный текст сохранить в новом файле.
1.13. В файле записаны коэффициенты квадратного уравнения. Считать их, решить уравнение и записать полученные корни. Сделать в виде таблицы для нескольких уравнений.

1.14. Дан текстовый файл, определить в нем процент слов начинающихся на букву” к”. ответ дописать в конец файла.

1.15. Дан файл .Все однозначные числа из него переписать в другой файл.

 

Задание 2.
2.1. Дополнить лабораторную работу №3.
— сохранить массив структур в файл;
— организовать поиск по заданному признаку запись или записи в файле;
— изменить данные и записать их на это же место в файл;
— вывести всю информацию из файла на экран.

 

 

3. Содержание отчета.

1. Занести в отчет тексты программ индивидуального задания и результаты, которые получились в каждой программе, привести ошибки ,которые были исправлены в процессе отладки программы.

2. Правильные задачи должны быть предоставлены и в отчете и в электронном варианте для защиты у преподавателя
1. Текст программы индивидуального задания.

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

 

ПРИЛОЖЕНИЕ.

Все ниже изложенные функции, cтруктуры и потоки определены во включаемом фай-ле <stdio.h.>
1. Структура FILE* — структура управления потоком файлов.
Хранит информацию, связанную с устройством или файлом.
typedef struct {
short level; //fill/empty level of buffer
unsigned flags; //file status flags
char fd; //file descriptor
unsigned char hold; //ungetc char if no buffer
short bsize; //buffer size
unsigned char *buffer, *curp; //data transfer buffer, current active pointer
unsigned istemp; //temporary file indicator
short token; //used for validity checking
} FILE;

 

2. Стандартные потоки
stdin Стандартный поток ввода
stdout Стандартный поток вывода
stderr Стандартный поток сообщений об ошибках
stdprn Стандартный поток вывода на принтер

 

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

2.1. Открытие файла
FILE *fopen(const char *filename, const char *mode);
Возвращает указатель на структуру FILE, если файл открыт успешно иначе NULL.

mode: 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);

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

2.5. Ввод /вывод строк
ввод из потока строки символов
char *fgets(char *s, int n, FILE *stream);
char *s — адрес, куда поместить введенные символы
int n — размер буфера
вывод в поток строки символов
int fputs(const char *s, FILE *stream);

2.6. Форматированный ввод/вывод:
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.7. Ввод/вывод записей фиксированной длины
— применяется, если данные будут использоваться только вашими программами.
вывод: 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,sizeof(a),1,in);

2.8. Позиционирование указателя файла:
int fseek(FILE *stream, long offset, int whence);
long offset — число байтов смещения
whence: SEEK_SET == 0 c начала файла
SEEK_CUR == 1 с текущей позиции
SEEK_END == 2 от конца файла

2.9. Получение текущего положения указателя файла:
long ftell(FILE *stream);
Другие функции ввода/вывода описаны в файлах stdio.h и io.h.

Загрузка...