Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
otvety_po_OAiPR.doc
Скачиваний:
3
Добавлен:
01.03.2025
Размер:
1.23 Mб
Скачать

183) Объявление файла

Файл — это именованная структура данных, представляющая собой последовательность элементов данных одного типа, причем количество элементов последовательности практически не ограничено. В первом приближении файл можно рассматривать как массив переменной длины неограниченного размера.

Как и любая структура данных (переменная, массив) программы, файл должен быть объявлен в разделе описания переменных. При объявлении файла указывается тип элементов файла.

В общем виде объявление файла выглядит так: Имя:file of ТипЭлементов;

Примеры:

res: file of char; // файл символов

koef: file of real; // файл вещественных чисел

f: file of integer; // файл целых чисел

Файл, компонентами которого являются данные символьного типа, называется символьным, или текстовым. Описание текстового файла в общем виде выглядит так:

Имя:TextFile;

где: имя — имя файловой переменной;

TextFile — обозначение- типа, показывающее, что Имя — это файловая переменная, представляющая текстовый файл.

184) Файл последовательного доступа

Рассматривается как последовательность строк произвольной длины, разделенных специальными символами. Чтение и запись в файл производится построчно.

Файлами последовательного доступа - это наборы строк с ASCII символами. Для их открытия используются режимы:

Input - последовательное чтение данных;

Output - последовательная запись данных с перезаписью, т.е. информация записывается всегда с начала файла, даже если в файле уже что-то записано;

Append - добавление данных в файл (запись в конец файла).

Данные записываются с помощью инструкций: Print # и Write #.

Write # - дополнительно автоматически вставляет в файл разделители.

Print # fileNumber, [outputlist]

FileNumber - номер файла, аналогичный номеру файла в операторе Open;

Outputlist - список выражений или переменных для записи.

Write # fileNumber, [outputlist]

Эта инструкция после каждой строки автоматически вставляет разделители строк, а именно символы перевода каретки CHR(13) и символ новой строки CHR(10).

Чтение данных осуществляется функцией Input.

Input (number, #filenumber)

Number - целое число, задающее количество считываемых из файла символов;

filenumber - номер файла, как в операторе Open.

Для определения количества считываемых символов используется функция FileLen - длина файла в байтах.

Если в программе требуется прочитать данные из файла, в котором информация в строках имеет структуру с разделителями (запятые), то необходимо применить оператор Input #.

Input #filenumber, varlist

Varlist - список переменных.

Для корректной работы инструкции строки файла должны иметь заданную структуру с разделителями. Т.е. использоваться в паре с Write #.

Для чтения всего содержимого файла при помощи Input # необходимо организовать циклическое считывание данных из файла, поскольку данные считываются этим оператором по строкам.

185) Давайте сперва перед файлами произвольного доступа разберем режимы открытия:

r

открываем файл для чтения

w

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

a

создаем файл для записи. Если файл уже существует, то записываем данные в конец файла

r+

открываем файл для записи и чтения

w+

создаем файл для обновления. Если файл уже существует, то данные стираются

а+

создает файл для обновления. Если файл существует, то данные записываются в конец файла

Для чего мы сохраняем данные в файл? Ответом на этот вопрос является название нашего урока. Все что мы делали на предвидущем уроке, т.е. учились записывать данные в файл, то теперь наши труды надо прочитать с этого файла.

#include <conio.h>

#include <stdio.h>

int main()

{

int bal;

char name[15];

FILE *file;

if ((file = fopen("1.txt","r")) == NULL)

printf("Файл невозможно открыть или создать\n");

else{

for(;;){

if (feof(file))

break;

fscanf(file,"%d %s", &bal, name);

printf ("%d %s\n", bal, name);

}

}

fclose(file);

getch();

return 0;

}

Давайте теперь разберем отличия записи в файл и чтения из файла:

if ((file = fopen("1.txt","r")) == NULL)

Открывает файл в режиме чтения. Ну, это очевидный шаг, раз мы будем считывать данные

if (feof(file))

Проверяет условие окончания файла. В случае, когда все файлы будут считаны, сработает наша структура и выполнит операцию break

fscanf(file,"%d %s", &bal, name);

Считывает данные из файла и записывает их в указанные переменные. Действует, так же как и функция scanf(), только считывает введенные данные не с экрана, а с файла

Это мы с вами работали с файлами последовательного доступа

Файлы произвольного доступа

Созданные данные с помощью функции fprintf не обязательно должны быть одинаковой длины. Данные, которые создаются в файле с произвольным доступом, имеют определенную длину, что позволяет быстро и легко найти нужную нам запись. Поэтому файлы произвольного доступа очень распространены в различных организациях.

В файлы произвольного доступа можно легко добавлять, удалять записи, не перезаписывая остальные данные. Это очень удобно, так как иногда приходится изменять одну и туже строчку много раз.

На следующем уроке вы поймете, как создаются файлы произвольного доступа, как записывается и считывается информация с этих файлов.

186) Рассмотрим реализацию работы с файлами на языке С++. Решим простейшую задачу на сложение 2-х чисел, записанных в файле input.txt. Результат запишем в файл output.txt. Файлы находятся в одном каталоге с исполняемым файлом программы.

Алгоритм такой:

Подключаем библиотеку ввода-вывода stdio.h

Объявляем две переменные a,b типа long

Используем функцию freopen(«file_path»,»type»,»STREAM»). Здесь «file_path» – имя файла и путь к нему; «type» режим доступа к файлу (см. ниже); «STREAM» – поток ввода-вывода. С помощью процедуры форматного ввода scanf считываем из файла числа в переменные a и b. С помощью процедуры форматного вывода printf записываем сумму в файл.

Код программы

#include <iostream>

#include <stdio.h>

using namespace std;

int main()

{

long a,b;

freopen(«input.txt»,»r»,stdin); //Переключаем stdin – стандартный поток ввода с клавиатуры – на ввод из файла

freopen(«output.txt»,»w»,stdout); //Переключаем stdout – стандартный вывод на экран – на вывод в файл

scanf(«%ld%ld»,&a,&b);

printf(«%ld»,a+b);

return 0;

}

***************

Вариант №2

#include <iostream>

#include <stdio.h>

using namespace std;

int main()

{

long a,b;

freopen(«input.txt»,»r»,stdin);

freopen(«output.txt»,»w»,stdout);

cin>>a>>b;

cout<<a+b;

return 0;

}

Здесь вместо scanf и printf используются процедуры cin и cout

Режимы доступа к файлу

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

«w» открыть пустой файл для записи; если этот файл ранее существовал, его содержимое уничтожается.

«a» открыть файл для записи (добавления) в конец. Если данного файла нет, то вначале он создается.

«r+» открыть файл одновременно для чтения и записи. Файл должен существовать.

«w+» открыть пустой файл для чтения и записи. Если этот файл ранее существовал, его содержимое уничтожается.

«a+» открыть файл для чтения и добавления. Если файла нет, вначале он создается.

Замечание! Нужно внимательно применять режимы «w», «w+», так как они могут уничтожить существующие файлы.

Если файл открыт при помощи типа «a» или «a+», все операции записи выполняются в конец файла. При использовании функций fseek или rewind возможно перепозиционирование указателя на файл; несмотря на это, указатель на файл перед выполнением любых операций записи всегда возвращается в конец файла. Таким образом, существующие данные не будут перезаписаны. При использовании типов »r+’, «w+», «a+» допускается одновременно чтение и запись. (Говорится, что файл открывается для обновления). Поэтому при переключении чтения на запись и наоборот нужно использовать функции

fseek или rewind. Для функции fseek (при необходимости) может быть точно определена текущая позиция.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]