129.65K
Категория: ПрограммированиеПрограммирование

Разработка алгоритмов и программ чтения текстового файла и записи в него

1.

Тема занятий Разработка алгоритмов и
программ чтения текстового файла и записи
в него
Цель занятия: Рассмотреть систематизированные
основы знаний по операторам циклов с
условием на языке программирования СИ
Учебные вопросы:
1. Понятие файла в языке Си
2. Буферизация ввода-вывода
3 Текстовый и бинарный режим работы с файлами
4 Функция работы с файлами

2.

1 Понятие файла в языке Си
Файл - это упорядоченная последовательность однотипных
компонентов, расположенных на внешнем носителе.
Файлы предназначены только для хранения информации, а
обработка этой информации осуществляется программами.
Использование файлов целесообразно в случае:
долговременного хранения данных;
доступа различных программ к одним и тем же данным;
обработки больших массивов данных, которые невозможно целиком разместить
в оперативной памяти компьютера.
Файл, не содержащий ни одного элемента, называется пустым.
Создается файл путем добавления новых записей в конец
первоначально пустого файла.
Длина файла, т.е. количество элементов, не задается при
определении файла.
В языке Си отсутствуют операторы для работы с файлами. Все
необходимые действия выполняются с помощью функций,
включенных в стандартную библиотеку ввода-вывода языка Си
(stdio.h - standart input output).

3.

2 Буферизация ввода-вывода
Считываемая и записываемая информация представляет собой
последовательность байтов - "поток" (stream).
Поток – это логическое устройство, являющееся источником или
получателем данных.
В зависимости от того, откуда поступает считываемая информация или куда
направляется записываемая информация, поток связывается с соответствующим
устройством ввода вывода (клавиатура, дисплей, принтер и т.п.) или с
именованной областью внешней памяти – файлом, если требуется
долговременно хранить информацию либо получить доступ к хранимой
информации.
При организации ввода-вывода в С используется буферизация, то есть обмен
информацией между программой и внешним устройством происходит не
непосредственно, а через буфер – специально выделяемую системой область
оперативной памяти.
Буферизация ускоряет работу программы из-за уменьшения количества
обращений к внешним устройствам.
В библиотеке описана константа BUFSIZE, величина которой 512:
#define BUFSIZE
512
Для изменения размера буфера предназначены функции setbuf() или setvbuf().

4.

3 Текстовый и бинарный режим работы с файлами
Библиотека stdio.h поддерживает текстовые и бинарные (двоичные)
потоки.
Текстовый поток – это последовательность строк, каждая из которых
заканчивается символом ‘\n’. Операционная среда может потребовать
коррекции текстового потока. Например, при вводе текстового потока
система преобразует символы возврат каретки 0x13 и перевод строки
0x10 в одиночный символ ‘\n’. При обнаружении в текстовом файле
символа с кодом 26 (0x26), т.е. признака конца файла, чтение файла в
текстовом режиме заканчивается, хотя файл может иметь
продолжение. При выводе текстового потока в среду операционной
системы происходит обратное преобразование.
Бинарный поток – это последовательность не преобразуемых байтов,
представляющих собой некоторые промежуточные данные, которые
обладают тем свойством, что если их записать, а затем прочесть той
же системой ввода-вывода, то будет получена информация,
совпадающая с исходной.

5.

4 Функция работы с файлами
4.1 Функция fopen
Прежде чем читать или записывать информацию в файл, он должен быть открыт функцией
fopen и тем самым связан с потоком ввода-вывода. Функция открытия потока
возвращает указатель fp на предопределенную в библиотеке stdio.h структуру типа FILE
(содержащую всю необходимую для работы с потоком информацию) при успешном
открытии потока, или NULL в противном случае.
В stdio.h заданы 3 предопределенных потока :
stdin (стандартный поток ввода), stdout (стандартный поток
вывода), stderr (стандартный поток ошибок)
• Вывод данных через stdout и stderr по умолчанию осуществляется на консоль. Ввод
данных через stdin по умолчнию осуществляется через клавиатуру.
• Предопределенные потоки всегда открыты.
При открытии файла указатель на файл связывается с конкретным файлом на диске
(Если файл не может быть открыт по какой-либо причине, функция возвращает NULL. ) :
FILE *fp;
fp = fopen(“спецификация файла”, "способ использования файла");
“Спецификация файла” (т.е. имя файла и путь к нему) может, например, иметь вид:
"c:\\my_prog.txt" - для файла my_prog.txt на диске с: .
“Способ использования файла” - определяет режим открытия файла.

6.

Режимы открытия файла
r - открыть существующий файл для чтения;
w - создать новый файл для записи (если файл с указанным именем существует, то он
будет переписан);
а - дополнить файл (открыть существующий файл для записи информации, начиная с
конца файла, или создать файл, если он не существует);
r+ - открыть существующий файл для чтения и записи;
w+ - создать новый файл для чтения и записи;
a+ - дополнить или создать файл с возможностью чтения и записи;
rb - открыть двоичный файл для чтения;
wb - создать двоичный файл для записи;
аb - дополнить двоичный файл;
r+b - открыть двоичный файл для чтения и записи;
w+b - создать двоичный файл для чтения и записи;
а+b - дополнить двоичный файл с предоставлением возможности чтения и записи;
rt - открыть текстовой файл для чтения;
wt - создать текстовый файл для записи;
at - дополнить текстовый файл;
r+t - открыть текстовой файл для чтения и записи;
w+t - создать текстовый файл для чтения и записи;
a+t - дополнить текстовый файл с предоставлением возможности записи и чтения.
Строки вида r+b можно записывать и в другой форме: rb+.

7.

Примеры открытия файлов
FILE *f_in, *f_out;
f_in = fopen ("My_file1","r");
f_out = fopen ("My_file2","w");

8.

4.2 Функция fclose
После окончания работы с файлом он должен быть
закрыт. Закрытие файла (текстового или бинарного)
выполняется функцией fclose():
fclose(FILE *fp);
При этом разрывается связь указателя на
файл c внешним набором данных. Освободившийся
указатель можно использовать для другого файла.
При успешном завершении операции функция fclose( )
возвращает значение нуль. Любое другое значение
свидетельствует об ошибке.
Пример:
fclose(f_in);

9.

4.3 Проверка признака конца файла
При каждой операции ввода/вывода происходит
перемещение указателя текущей позиции в файле,
в какой-то момент указатель достигает конца
файла. Структура типа FILE имеет поле – индикатор
конца файла. Функция feof() проверяет состояние
индикатора конца файла и возвращает значение 0,
если конец файла не был достигнут, или значение,
отличное от нуля, если был достигнут конец файла.
Функция имеет единственный аргумент –
указатель на поток типа FILE.
Вызов функции:
if (! feof(f_in))…
проверяет, что конец файла еще не достигнут.

10.

4.4 Функции ввода/вывода
Функции fgetc() и fputc()
Простейший способ выполнить чтение из файла или
запись в файл – использовать функции getc() или putc().
Функция getc() выбирает из файла очередной символ; ей
нужно только знать указатель на файл:
char Symb = getc(f_in);
Если при обработке достигается конец файла, то
функция getc() возвращает значение EOF(end of file).
Функция putc() заносит значение символа Symb в файл, на
который указывает f_out. Формат вызова функции:
putc(Symb,f_out);

11.

Функции fgetc() и fputc()
Пример 1. Текст из файла my_char.txt выводится на экран. Если файл не найден, на экран выводится
сообщение "File not found!":
#include <stdio.h>
int main(void)
{
FILE *ptr;
unsigned char ch;
if ((ptr=fopen("my_char.txt","r"))!=NULL)
{
ch=fgetc(ptr);
while (!feof(ptr))
{
printf("%c",ch);
ch=fgetc(ptr);
}
fclose(ptr);
}
еlse printf("\nFile not found!");
return 0;
}
В этом примере для чтения из файла используется переменная ptr. При открытии файла производится проверка.
Если переменной ptr присвоено значение NULL, то файл не найден; на экран выводится соответствующее
сообщение, и программа завершается. Если ptr получила ненулевое значение, то файл открыт. Далее
выполняется чтение символов из файла до тех пор, пока не будет достигнут конец файла (!feof(ptr)).
Прочитанные символы помещаются в переменную ch, а затем выводятся на экран.

12.

Функции getc() и putc()
Пример 2. Записать в файл буквы, вводимые с клавиатуры.
Ввод продолжается до нажатия клавиши F6 или CTRL/z
(ввод символа EOF – конца файла):
#include <stdio.h>
int main(void)
{
char c;
FILE *out;
out=fopen("Liter","w");
while ((c=getch( ) )!=EOF)
fputc(c,out);
fclose(out);
return 0;
}

13.

Функции fscanf() и fprintf()
Функции fscanf() и fprintf() выполняют форматированный ввод/вывод.
Чтение из файла выполняет функция fscanf():
fscanf(f_in,[строка формата],[список адресов переменных]);
Функция возвращает количество введенных значений или EOF.
Запись в файл осуществляет функция fprintf():
fprintf(f_out,[строка формата],[список переменных, констант]);
Функция возвращает количество выведенных байт (символов) или EOF.
Строка формата функций fscanf() и fprintf() формируется так же, как
при консольном вводе/выводе функциями printf() и scanf().
Следует заметить, что вызов функции
fscanf(stdin,[строка формата],[список адресов переменных]);
эквивалентен вызову
scanf([строка формата],[список адресов переменных]);
Аналогично,
fprintf(stdout, [строка формата],[список переменных, констант]);
эквивалентно
printf([строка формата],[список переменных, констант]);

14.

Примеры программ, использующих
функции fscanf() и fprintf()
Пример 1. В программе создается массив, состоящий из четырех целых
чисел. Вывести массив в файл:
#include <stdio.h>
#define n 4
int main() {
int i=0;
int array[n]={4,44,446,4466};
FILE *out;
out=fopen("num_arr.txt","w");
for(;i<n;i++)
fprintf(out,"%6d",array[i]);
fclose(out);
return 0; }
В результате выполнения программы в файл num_arr.txt будет помещена
следующая информация:
4
4 4
4 4 6
4 4 6 6

15.

Примеры программ, использующих
функции fscanf() и fprintf()
Пример 2. Имеется файл данных,
содержащий целые числа, разделенные
пробелами. Количество чисел в файле
неизвестно. Требуется найти среднее
арифметическое значение этих чисел.
#include <stdio.h>
int main() {
int S=0, count=0, numb;
FILE *in;
if ((in=fopen("num_arr.txt","r"))!=NULL)
{
while (!feof(in))
{
fscanf(in,"%d",&numb);
S+=numb;
count++;
printf("%d\n", numb);
}
Чтение чисел из файла выполняется в
переменную numb до тех пор, пока не будет
достигнут конец файла. Одновременно
ведется подсчет количества прочитанных
символов в переменной count и накопление
double aver=(double)S/count;
суммы прочитанных чисел в переменной S.
printf("Average=%f\n", aver);
Переменные S и count целые, поэтому для
fclose(in);
правильного вычисления среднего
}
арифметического, необходимо выполнить
else
преобразование одной из этих переменных
printf("\nФайл не найден!");
в формат double.
return 0; }

16.

Примеры программ, использующих
функции fscanf() и fprintf()
#include <conio.h>
#include <stdio.h>
int main() {
int bal;
char name[15];
FILE *file;
if ((file = fopen("1.txt","w")) == NULL)
printf("Файл невозможно
открыть или создать\n");
else{
for(;;){
scanf ("%d%s", &bal, name);
if (bal == 0)
break;
fprintf(file,"%d %s\n", bal,
name);
}
}
fclose(file);
return 0; }
Пример 3. Ввод имени и балла.
FILE *file;
объявляем указатель на структуру File ( дескриптор файла ).
if ((file = fopen("1.txt","w")) == NULL)
функция fopen принимает два параметра.
Первый - это имя файла,
второй - режим работы с файлом, в котором он будет открыт.
В нашем режиме, если файл не существует, то он создается,
а если файл уже был, то его содержимое полностью стирается.
Эта функция возвращает указатель на структуру FILE ,
т.е. теперь мы сможем управлять созданным файлом при
помощи нашего указателя file.
Оператор if тут используется, так как идет проверка
указателя на NULL, а NULL может быть, только если файл мы не
смогли открыть.
fprintf(file,"%d %s\n", bal, name);
оператор записывает данные в файл.
Принцип действия тот же, какой и у оператора printf, только тут
в начале указывается указатель на файл , в который будет
производится запись данных.
fclose(file);
раз данные мы записали и файл нам больше не нужен,
то смело может закрывать его, тем самым освобождая ресурсы.
English     Русский Правила