ЗАПИСЬ И ЧТЕНИЕ БЛОКОВ ДАННЫХ ИЗ ФАЙЛА
Цель работы:получение практических навыков по записи и чтению блоков данных из файла.
Краткие теоретические сведения
Специальные функции обмена с файлами имеются только для символьного и целого типов данных. В общем случае используются функции чтения и записи блоков данных. С их помощью можно записывать в файл и читать из файла вещественные числа, массивы, строки, структуры. При этом сохраняется форма внутреннего представления данных.
Функция записи блока данных имеет прототип
int fread(void*buf, int bytes, int n, FILE*fptr);
Здесь
buf – указатель на адрес данных, записываемых в файл;
bytes – длина в байтах одной единицы записи (блока данных);
n – число блоков, передаваемых в файл;
fptr – указатель на поток.
Если запись выполнилась благополучно, то функция возвращает число записанных блоков (значение n).
Функция чтения блока данных из файла имеет прототип
int fwrite(void*buf, int bytes, int n, FILE*fptr);
Пример 4.следующая программа организует запись блоков в файл строки (символьного массива), а также чтение и вывод на экран записанной информации.
# include <stdio.h>
# include <string.h>
void main()
{ FILE *stream;
char msg[ ]=”this is a test”;
char buf[20];
if (( stream=fopen(“DUMMY.FILL”,”w+”))==NULL)
{puts(“Не могу открыть файл \n”); return;}
// Запись строки в файл
fwrite(msg, strlen(msg)+1, 1, stream);
// Установка указателя на начало файла
fseek(stream, 0, SEEK_SET);
// Чтение строки из файла
fread(buf, strlen(msg)+1, 1, stream);
printf(“%s \n”,buf);
fclose(stream);
}
В этой программе поток открывается в режиме w+ (создание для записи с последующим чтением). Поэтому закрывать файл после записи не потребовалось. Новым элементом данной программы по сравнению с предыдущими является использование функции установки указателя потока в заданную позицию. Ее формат
int fseek(указатель_на поток, смещение, начало_отсчета);
Начало отсчета задается одной из констант, определенных в файле stdio.h:
SEEK_SET (имеет значение 0) – начало файла;
SEEK_CUR (имеет значение 1) – текущая позиция;
SEEK_END (имеет значение 2) – конец файла.
Смещение определяет число байт, на которое надо сместить указатель относительно заданного начала отсчета. Смещение может быть как положительным, так и отрицательным числом. Оба параметра имеют тип long.
Форматный обмен с файлами
С помощью функции форматного вывода можно формировать на диске текстовый файл с результатами вычислений, представленными в символьном виде. В дальнейшем этот файл может быть просмотрен на экране, распечатан на принтере, отредактирован с помощью текстового редактора. Общий вид функции форматного вывода:
int fprintf (указатель_на_поток, форматная_строка, список_переменных);
Использовавшаяся нами ранее функция printf () для организации вывода на экран является частным вариантом функции fprintf (). Функция printf () работает лишь со стандартным потоком stdin, который всегда связывается системой с дисплеем. Не будет ошибкой, если в программе вместо printf () написать fprintf (stdin, …).
Правила использования спецификаторов форматов при записи в файлы на диске точно такие же, как и при выводе на экран.
Пример 5.Составим программу, по которой будет рассчитана и записана в файл таблица квадратных корней для целых чисел от 1 до 10. Для контроля эта же таблица выводится на экран.
//Таблица квадратных корней
#include <stdio.h>
#include <iostream.h>
#include <math.h>
voidmain()
{ FILE *fp;
intx;
fp = fopen(“test.dat”, “w”);
//Вывод на экран и в файл шапки таблицы
printf(“\t Таблица квадратных корней \n”);
fprintf(fp, “\t Таблица квадратных корней \n ”);
printf(“\t x\t\tsqrt(x) \n”);
fprintf(fp, “\t x\t\tsqrt(x) \n ”);
\\Вычисление и вывод таблицы квадратных корней
\\на экран и в файл
for(x = 1; x<=10; x++)
{ printf(“\t%f\t%f\n”, float(x), sqrt(float(x)));
fprintf(fp, “\t%f\t%f\n”, float(x), sqrt(float(x)));
}
fclose(fp); }
Форматный ввод из текстового файла осуществляется с помощью функции fscanf (), общий формат которой выглядит следующим образом:
int fscanf(указатель_на_поток, форматная_строка, список_адресов_переменных);
Данной функцией удобно пользоваться в тех случаях, когда исходные данные заранее подготавливаются в текстовом файле.
В следующем примере числовые данные из файла test.dat, полученного в результате выполнения предыдущей программы, вводятся в числовые массивы x и y. Для контроля значения элементов массивов выводятся на экран. Предварительно с помощью текстового редактора в файле test.dat удаляются две первые строки с заголовками. В результате в файле останутся только числа.
Пример 6.
\\Ввод чисел из файла
#include <stdio.h>
#include <iostream.h>
#include <math.h>
voidmain()
{ FILE *fp;
inti;
floatx [10], y [10];
fp = fopen(“test.dat”,”r”);
for(i = 0; i<10; i++)
{ fscanf(fp, “%f%f”, &x[i], &y[i]);
printf(“%f %f\n”, x[i], y[i]);
}
fclose(fp);
}
Порядок выполнения работы
1. Изучить теоретические сведения.
2. Выполнить задание.
Задания для выполнения
1. Набрать и выполнить примеры.
2. Написать аналогичные программы для таблицы умножения целых чисел от 2 до 10.
ЛАБОРАТОРНАЯ РАБОТА № 32
ДОБАВЛЕНИЕ, УДАЛЕНИЕ ДАННЫХ ИЗ ФАЙЛА
Цель работы:получение практических навыков по добавлению и удалению данных из файла.
Краткие теоретические сведения
Создать программу, в которой реализованы создание, добавление и просмотр файла, содержащего информацию о фамилии и среднем балле студентов. Процесс добавления информации заканчивается при нажатии точки.
#include <stdio.h>
#include <stdlib.h>
struct Sved {
char Fam[30];
double S_Bal;
} zap,zapt;
char Spis[]="c:\\work\\Sp.dat";
FILE *F_zap;
FILE* Open_file(char*, char*);
void main (void)
{
int i, j, kodR, size = sizeof(Sved), kod_read;
while(1) {
puts("Создать – 1\n Добавить– 3\nПросмотреть– 2\nВыход – 0");
scanf("%d",&kodR);
switch(kodR) {
case 1:
case 3:
if(kodR==1) F_zap = Open_file (Spis,"w+");
else F_zap = Open_file (Spis,"a+");
while(2) {
puts("\n Fam (. – end) ");
scanf("%s",zap.Fam);
if((zap.Fam[0])=='.') break;
puts("\n Ball: ");
scanf("%lf",&zap.S_Bal);
fwrite(&zap,size,1,F_zap);
}
fclose(F_zap);
break;
case 2: F_zap = Open_file (Spis,"r+"); int nom=1;
while(2) {
if(!fread(&zap,size, 1, F_zap)) break;
printf(" %2d: %20s %5.2lf\n",
nom++, zap.Fam, zap.S_Bal);
}
fclose(F_zap);
break;
case 0: return; // exit(0);
} // Закрывает switch()
} // Закрывает while()
}
// Функция обработки ошибочной ситуации при открытии файла
FILE* Open_file(char *file, char *kod)
{
FILE *f;
if(!(f = fopen(file, kod))) {
puts("Open File Error!");
exit(1);
}
return f;
}
Советы по программированию
При выполнении вариантов заданий придерживайтесь следующих ключевых моментов.
1. Объекты типов структуры и объединения применяются для логически связанных между собой данных различных типов.
2. После описания шаблона структурного типа данных ставится точка с запятой.
3. Элементы данных, входящие в структуры и объединения, называются полями. Поля могут быть любого базового (стандартного) типа данных, массивом, указателем, объединением или структурой.
4. Для обращения к полю используется операция принадлежности (привязки, выбора) «.» (точка) при обращении через ID структуры, или «–>» (стрелка) при обращении через указатель.
5. Структуры одного типа можно присваивать друг другу с использованием стандартной функции memcpy.
6. Ввод-вывод структур выполняется поэлементно.
7. Структуры, память под которые выделяет компилятор, можно инициализировать значениями их полей.
8. Файл – это именованный объект, хранящий данные на каком-либо носителе, хотя может располагаться и на электронном диске в ОП.
9. Файл не имеет фиксированной длины, т.е. может увеличиваться или уменьшаться в процессе обработки.
10. Перед работой файл необходимо открыть (функция fopen), а после работы закрыть (функция fclose).
Порядок выполнения работы
1. Изучить теоретические сведения.
2. Выполнить задание.
Задания для выполнения
1. Набрать и выполнить пример.
2. Переделать программу, используя функции для создания, добавления и просмотра данных.
ЛИТЕРАТУРА
1. Семакин, И. Г., Шестаков А. П. Основы программирования: учебник для сред. Проф. Образования / И.Г. Семакин, А.П. Шестаков. – Издательский центр «Академия», 2003. – 432 с.
2. Шилдт, Г. Самоучитель Си++/ Г. Шилдт. – Санкт-Петербург: БХВ-Петербург, 2004. – 688 с.
3. Батура М. П., Бусько В. Л., Корбит А. Г., Кривоносова Т. М. Основы алгоритмизации и программирования. Язык Си: учеб. пособие / М. П. Батура, В. Л. Бусько, А. Г. Корбит, Т. М. Кривоносова. – 2-е изд. – Минск: БГУИР, 2008. – 240 с.
Не нашли, что искали? Воспользуйтесь поиском по сайту:
©2015 - 2024 stydopedia.ru Все материалы защищены законодательством РФ.
|