Посимвольный ввод-вывод
В операциях посимвольного ввода-вывода происходит прием одного символа из файла или передача одного символа в файл.
Функция |
Действие функции |
int fgets(FILE *fp) |
Чтение и возврат символа из открытого файла |
int fgetchov(void) |
Читает и возвращает символ из файла stdin. |
int ungetc(int ch, FILE *fp) |
Возвращает символ ch в файл. Следующая операция чтения символа из файла вернет этот символ. |
int fputs(int ch, FILE *fp) |
Записывает в файл код ch символа. |
Построчный ввод-вывод.
В операциях построчного ввода-вывода за один прием происходит перенос из файла (или в файл) строк символов.
Функция |
Действие функции |
int gets (char *S) |
Читает байты из файла stdin и записывает их в строку S до тех пор, пока не встретит символ ' \n ', который заменяется на нуль – терминатор. |
int fgets (char *S int m, FILE *fp) |
Извлекает байты из файла, описываемого fp, и записывает их в строку S до тех пор, пока не встретит символ ' \n ' или пока не будет считана m байтов. |
int fputs (char *S, FILE *fp) |
Записывает в файл байты из строки S до тех пор, пока не встретится нуль-терминатор, который в файл не переносится и на символ ' \n ' не заменяется. |
int puts (char *S) |
Записывает в файл, stdout байты из строки S до тех пор, пока не встретится нуль-терминатор, который в файл переносится и заменяется на символ ' \n '. |
Блоковый ввод-вывод
В операциях блокового ввода-вывода работа происходит с целыми блоками информации.
Функции |
Действие функции |
int fread (void *ptv, int size, int n, FILE *fp) |
Считывает n блоков по size байт каждый из файла fp, в область памяти, на которую указывает указатель ptv (необходимо заранее отвести память под считываемый блок). |
int fwrite (void *ptv, int size, int n, FILE *fp) |
Записывае n блоков по size байт каждый из области памяти, на которую указывает ptv, в открытый файл fp. |
Пример работы с файлами. Следующая программа формирует целочисленный бинарный файл, дозаписывает в его окончание новые данные, и выводит сохраненные данные на печать:
#include <stdio.h>
#include <conio.h>
void main(void)
{
int a=1, b=20, c, d;
FILE *in, *out, *add;
clrscr();
/* ........ ЗАПИСЬ ЧИСЕЛ В ФАЙЛ ......*/
in=fopen("lr8.dat","wb");
fprintf(in,"%d %d \n",a,b);
fclose(in);
puts("ЧИСЛА a, b ЗАПИСАНЫ В ФАЙЛ");
puts("Press any key...");
getch();
/* ......... ЧТЕНИЕ ЧИСЕЛ ИЗ ФАЙЛА ........*/
out=fopen("lr8.dat","rb");
fscanf(out,"%d%d", &c, &d);
printf("\n a=%d b=%d ", c, d);
fclose(out);
puts("\n ЧИСЛА ПРОЧИТАНЫ ИЗ ФАЙЛА");
puts("Press any key...");
getch();
/* ......... ДОПОЛНЕНИЕ ФАЙЛА ..........*/
add=fopen("lr8.dat","a");
puts("ВВЕДИТЕ ЧИСЛА ЦЕЛОГО ТИПА c и d");
scanf("%d%d",&c,&d);
fprintf(add,"%d %d \n",c,d);
printf("\n c=%d d=%d \n ",c,d);
fclose(add);
puts("ЧИСЛА c и d ДОПИСАНЫ В ФАЙЛ");
puts("Press any key...");
getch();
/* ......... ЧТЕНИЕ ЧИСЕЛ ИЗ ФАЙЛА ........*/
out=fopen("lr8.dat","rb");
fscanf(out,"%d%d%d%d", &a, &b, &c, &d);
printf("\n a=%d b=%d ", a, b);
printf("\n c=%d d=%d ", c, d);
fclose(out);
puts("\n РАСШИРЕННЫЙ ФАЙЛ!");
puts("Press any key...");
getch();
}
Краткие теоретические сведения
Файл – это набор данных, размещенный на внешнем носителе и рассматриваемый в процессе обработки и пересылке как единое целое.
Прежде, чем начать работать с файлом, его нужно открыть для доступа, т.е. создать и инициализировать область данных, которая содержит информацию о файле: имя, путь и т.д.
Это выполняет функция
fopen(“строка1”, “строка2”);
она связывает физический файл на носителе (дискета, винчестер), путь к которому указывается в строке1, например “a:Mas_dat.dat”, “d:\\work\\Sved.txt”, с логическим именем, объявленным в программе.
В строке2 указываются коды режимов доступа к открываемым файлам (табл.1).
Логическое имя – это указатель на файл, т.е. на область памяти, где храниться информация о файле. Формат объявления указателя на файл следующий:
FILE *указатель на файл;
Например:
FILE *f;
f=fopen ("d:\\work\\Dat_sp.cpp", "w");
- открывается файл Dat_sp.cpp на диске d, в каталоге work, только для записи.
Таблица 1