Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка по программированию.doc
Скачиваний:
11
Добавлен:
13.11.2019
Размер:
1.2 Mб
Скачать

Void main()

{ int i,j=10.k;

FILE *pp;

Pp=fopen(“one.dat","r");

for(i=0; i<j; i++)

{ fscanf(pp,”%d”,&k);

printf("%d\n",k); }

fclose(pp); }

В программе файл one.dat открывается для чтения. В цикле с помощью функции чтения из файла fscanf в пе­ременную k из этого файла читается очередное число, и его значение выводится на экран. После чтения десяти чисел файл закрывается, и программа завершает работу.

Функция fscanf также похожа на функцию ввода с клавиатуры scanf. В ней на первом месте стоит ука­затель на файл. С оформлением форматной строки дело обстоит несколько сложнее. Прежде всего, нужно знать, что если в форматной строке стоит некий символ, то вы должны быть уверены, что текущая позиция читаемого файла содержит именно этот символ. Например, если в форматной строке стоит \n, то и в файле в этот момент находится символ перехода на новую строку. В этой свя­зи рекомендуется, по крайней мере, на первых порах, во­обще не писать в форматной строке ничего, кроме фор­матных выражений. Избегайте даже пробелов. Учитывая эти тонкости, разработчики системы позаботились о том, чтобы функция fscanf в какой то степени сама разбиралась с размещением записей в файле. Как бы ни размещались числа: каждое в своей строке, группами в строках, все в одной строке — вы просто пишете подряд столько форматных выра­жений, сколько нужно прочитать чисел (или символов). Не обращайте внимание на то, как расположены данные в файле. Можете считать, что они все записаны подряд в строчку.

Нормально сформированный файл всегда имеет по­следним символом признак конца файла EOF (end of file). Существует специальная функция feof, имеющая аргу­ментом файловую переменную, которая показывает, до­стигнут ли конец файла. Для более ясного представления о работе функции feof представим файл в виде кинолен­ты, которая прокручивается так, что после очередного чтения данных следующий кадр устанавливается в " фай­ловое окно". В качестве кадра надо понимать очередной байт, записанный в файл. В самом последнем кадре фай­ла и находится признак конца файла EOF. Если после очередного чтения из файла в "файловом окне" оказал­ся признак конца, то при вызове функции feof она воз­вращает 1, иначе конец файла не достигнут, и функция возвращает 0.

Рассмотрим новую стандартную функцию int getc(FILE *f). Как видно из такого ее формального определения, функция getc возвращает целое число и имеет своим аргументом указатель на файл. Функция читает из файла очередной символ (байт) и возвращает его код (значение). Обратим внимание на то, что читает­ся один байт, а возвращаемое значение конвертируется в тип int, занимающий два байта.

Функция int putc(int с,FILE *f) записывает в очередную позицию файла символ, код которого задан первым аргументом. Первый аргумент имеет тип int, a при записи в файл значение конвертируется в тип char. Таким образом, на месте первого параметра может на­ходиться как код символа, так и сам символ. Функция возвращает код записанного символа, что может быть использовано в программе.

Теперь уместно, безотносительно к текущей теме - файлам, рассмотреть еще несколько полезных функций. Функция int getch(void), нам уже знакомая, читает символ, ска­жем так, из стандартного файла ввода/вывода. А стан­дартным файлом назовем консоль. Следовательно, функ­ция вводит символ с клавиатуры. До сих пор мы поль­зовались этой функцией для того, чтобы сохранить от­крытым рабочий экран до нажатия любой клавиши. Это действительно важное приложение функции, но ее основ­ным назначением является передача в программу симво­ла, считываемого с клавиатуры.

Функция int putch(int с), наоборот, передает сим­вол, заданный своим аргументом, в стандартный файл ввода/вывода. А чтобы перестать испытывать терпение читателя, то автор будет вынужден сказать по-простому: функция печатает на экран символ - свой аргумент.

В некоторых реализациях систем программирования, в частности в TURBO С, вы можете встретить мо­дификации этих функций getchar, putchar, getche и putche. Эти разновидности описанных выше функций отличаются режимом работы, в том числе буферизацией или не буферизацией ввода. Сказав эти загадочные слова, автор этим и ограничится, отослав любопытного читате­ля к справочной системе TURBO C++ и к литературе.

Наряду с чтением и записью одиночных символов су­ществуют функции чтения и записи строк, как для консо­ли, так и для файлов. Эти функции имеют имена gets, puts, fgets и fputs.

Функция char* gets(char* s) читает строку симво­лов с клавиатуры (до нажатия клавиши ввода) и поме­щает ее в память, начиная с адреса s. При этом в каче­стве аргумента функции целесообразно использовать имя описанного в программе символьного массива, в который будет помещена прочитанная с консоли строка.

Функция int puts(const char* s) может иметь сво­им аргументом указатель на символ - имя символьного массива или непосредственно строку символов в кавыч­ках. Строка или массив выводится на экран.

Из файла может быть прочитана или в файл может быть записана строка. Первую из этих задач выполняет функция char* fgets(char*, int, PILE* ). Она чи­тает из файла, на который указывает последний аргу­мент, очередную строку, записывает ее в память по адре­су, на который указывает первый аргумент. При этом чи­тается количество символов, не превышающее значения второго аргумента, уменьшенного на единицу. В конец записанной в память строки автоматически добавляется признак конца строки \0. Сама функция, в соответствии с ее типом char*, возвращает адрес начала строки.

Следующая программа, текст которой будем считать находящимся в файле re, построчно читает сама себя и выводит на экран длины строк:

#include<stdio .h>

#include<string.h>