Urok10_3

Урок 10.3. Ввод-вывод символа

10. Файлы
10.3. Ввод-вывод символа
10.4. Ввод-вывод строк

10.3. Ввод-вывод символа

Прочитать символ из уже открытого файла или записать в него символ можно различными способами, из которых самыми простыми являются использование встроенных функций getc() и putc(). Эти функции работают аналогично известным нам функциям getchar() и putchar(), с той лишь разницей, что последние взаимодействуют только со стандартным вводом-выводом, а getc() и putc() – с файлами. Обращения к функциям getc() и putc() имеют следующий вид:

<переменная> = getc(<указатель файла>);

putc(<переменная>,<указатель файла> );

Например, для чтения символа из файла, на который указывает in, в переменную ch можно использовать оператор ch=getc(in);. Кстати, напомним, что получение символа от стандартного ввода осуществляется очень похожим оператором сh=getchar(); Для записи символа, содержащегося в переменной ch, в файл, на который указывает out, используется оператор putc(ch,out); а для записи этого же символа на стандартный вывод используется оператор putchar(ch);

Секрет такой "схожести" функций обмена с файлами и стандартным вводом-выводом прост. Все дело в том, что функции getchar() и putchar() в действительности определены в системе через файловые функции getc() и putc() следующим образом:

#define getchar() getc(stdin)
#define putchar(c) putc(c,stdout)

где stdin и stdout – указатели на стандартный системный ввод и вывод соответственно. Признаком конца файла при вводе с клавиатуры служит комбинация Ctrl-Z для IBM-PC, VAX, VMS, Ctrl-d для Macintosh, Enter-Ctrl-d для Unix. Проверка конца файла в этом случае выглядит так:

while(!feof(stdin)) …

Какой же символ читается из файла и в какое место файла он записывается при выполнении операций обмена данными между файлом и программой? Это определяется указателем на текущую позицию файла, который представляет собой целое число. Этот указатель всегда показывает на байт в файле, начиная с которого будут читаться данные из файла или записываться данные в файл. После выполнения операции обмена между файлом и программой указатель позиции файла смещается в направлении от начала к концу файла ровно на столько байт, сколько только что было прочитано из файла или записано в него. Таким образом, указатель позиции файла всегда показывает на байт в файле, начиная с которого осуществляется обмен данными. При открытии существующего файла для чтения из него данных (тип файла "r"), указатель позиции файла устанавливается в начало файла, при открытии нового файла для записи в него (тип файла "w"), указатель позиции файла также устанавливается в начало файла, при открытии существующего файла для добавления в него информации (тип файла "а"), указатель позиции файла устанавливается в конец файла, показывая на первый свободный байт. Указатель на текущую позицию файла представлен в системном шаблоне структуры FILE полем unsigned char *curp;.

10.4. Ввод-вывод строк

Удобными средствами обработки текстовых файлов могут служить функции чтения и записи строк fgets() и fputs(). Обращение к функции чтения строки из файла в общем виде представляется следующим образом:

char * fgets(<указатель_на_строку>,<длина_строки>,<указатель_файла>);

Первый аргумент функции является указателем на местоположение строки, в которую читаются данные. Второй аргумент задает максимальную длину считываемой строки. Функция прекращает свою работу после считывания из файла символа новой строки или считывания заданного числа символов минус один. После того как строка прочитана, в конец строки всегда добавляется нуль-символ. Третий аргумент определяет файл, из которого производится чтение. Например, прочитать из файла строку символов можно следующим образом:

FILE *fp;
char string[20];
fp=fopen("FILE1.TXT","r");
fgets(string,19,fp);
fclose(fp);

Функция fgets() возвращает нулевой указатель (значение NULL) в случае возникновения сбоя при чтении или обнаружения признака конца файла (значение EOF).

Функция записи строки в файл, в отличие от функции чтения, содержит два аргумента:

int fputs(<указатель_на_строку>,<указатель_на_файл>);

Например, записать в файл строку символов можно так:

FILE *fp; fp=fopen("FILE2.TXT","w");
fputs("Cтрока данных",fp); fclose(fp);

Функция fputs() возвращает значение EOF в случае обнаружения конца файла или ошибки записи.
При чтении из файла функция feof() используется для обнаружения конца файла.

Рассмотрим пример программы, в которой в файл записывается несколько строк, а затем они же читаются и выводятся на экран.

#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <locale.h>
 
int main(void)
{ 
	setlocale(LC_ALL, "Russian");
	FILE *pfs; //Указатель на файловый поток
	char rbuf[127] = "";
	errno_t err;
	//pfs = fopen("dat.txt", "wt"); //fopen() небезопасная функция
	if ((err = fopen_s(&pfs, "dat.txt", "wt")) != 0)
		printf("Файл не был открыт\n");
	fputs("Пример работы с файлом\n", pfs);
	fputs("Еще одна строка\n", pfs);
	fputs("Последняя строка файла", pfs);
	puts("Произведена запись строк в файл");
	fclose(pfs);
	//pfs = fopen("dat.txt", "rt"); //не безопасная функция fopen()
	fopen_s(&pfs, "dat.txt", "rt"); //безопасная функция fopen()
	puts("\nСодержимое файла:");
	while(!feof(pfs))
	{
		fgets(rbuf, sizeof(rbuf)-1, pfs);
		printf("Очередная строка: %s", rbuf);
	}
        fclose(pfs);
	puts("\nКонец программы");
	_getch();
	return 0;
}

 

Translate Переводчик

Подписка на новости

SmartResponder.ru
Ваш e-mail: *
Ваше имя: *

Хостинг для Wordpress сайтов