Организация потокового ввода вывода. Процедурно-ориентированные средства работы с потоками, страница 4

mode – SEEK_SET – смещение от начала файла,

             SEEK_CUR – смещение вперед (назад) от текущей позиции,

             SEEK_END – смещение от конца файла.

# include <stdio.h>

# include <stdlib.h>

void main ()

{

 FILE* outf, int c, value = 100;

 outf = fopen("INT.DAT", "r+b");

 if (fseek (outf, 11*sizeof(int), SEEK_SET)! = 0)

 { puts ("ошибка позиционирования"); exit (1); }

 else

 {

   fread (&c, sizeof(int), 1, outf);

   printf ("12-ое число==%d", c);

 }

 fclose (outf);

}

Чтобы на основе файла с произвольным доступом получить типизированный файл, необходимо, чтобы все записи файла имели одинаковый тип и длину. Если файловый указатель FILE*  указывает на открытый файл записей типа t, то следующие операторы выполняют позиционирование в файле.

·  переместить файловый указатель на следующую позицию от текущей

fseek (f, sizeof(t), SEEK_CUR);

·  переместить файловый указатель на предыдущую позицию от текущей

fseek (f, -sizeof(t), SEEK_CUR);

·  переместить файловый указатель в конец файла

fseek (f, 0, SEEK_END);

·  получить указатель файла. Файловый указатель запоминается в переменной pos как смещение в байтах от начала файла. Функция возвращает значение 0 в случае успеха, -1 – в случае ошибки

int fgetpos(FILE* stream, longint* pos);

·  восстановить позицию файлового указателя

int fsetpos(FILE* stream, longint* pos);

·  получить файловый указатель

longint ftell(FILE* stream);    

# include <stdio.h>

# include <stdlib.h>

void main ()

{

 FILE* inf; longint pos; char buffer[128];

 inf = fopen(“AAA.cpp”, “rb”);

 fgets(buffer, 128, inf);

 printf(“1-я строка==%s\n”, buffer);

 fgetpos(inf, &pos);

 fgets((buffer, 128, inf);

 printf(“2-я строка==%s\n”, buffer);

 fsetpos(inf, &pos);

 fclose(inf);

}

Библиотека ввода/ вывода С + +


Иерархия классов библиотеки ввода /вывода

              Потоковые классы находятся в следующих файлах:


Стандартные потоки для базовых типов

             В модуле iostream.h содержится определение стандартных потоков ввода вывода:

·  сin - объект класса istream связанный со стандартным буферизированным входным потоком

·  cout – объект типа ostream, связанный со стандартным буферизованным выходным потоком

·  cerr – объект класса ostream, связанный со стандартным небуферизированным выходным потоком, в котором выдаются собщения об ошибках

·  clog – объект класса ostream, связанный со стандартным буферизированным выходным потоком, в котором выдаются сообщения об ошибках.

            В модуле iostream.h определены стандартные операции ввода и вывода данных. Операция ввода класса istream называется извлечением (чтением) данных из потока. Она обозначается символом операции сдвига вправо >>. Операция вывода класса ostream называется вставкой (записью) данных в поток. Она обозначается с помощью операции сдвига влево <<. Операции сдвига интерпретируются как операция ввода/вывода только в том случае, если левым операндом является один из объектов класса iostream: cin, cout, cerr, clog:

cin >> имя_объекта базового типа

cout << выраж-е_базового _типа

cerr << выраж-е_базового _типа

clog  <<  выраж-е_базового _типа

Особенности операций вставки и извлечения

1) в соответствии с синтаксисом С++  операции сдвига имеют невысокий приоритет, поэтому правильными являются следующие выражения:

cout << 2 + 3 +4;

cout << (x<0 ?–x: x);

2) так как операции вставки и извлечения возвращают ссылку на потоковый объект, являющийся левым операндом, то операции вставки и извлечения можно связывать в цепочки