Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Листинг 5. Произвольный доступ к файлу

Читайте также:
  1. BЫБОР ОПЕРАТИВНОГО ДОСТУПА
  2. VІІ. Рівний доступ до здобуття якісної освіти
  3. Б) недоступність струмоведучих частин для випадкового дотику.
  4. Биологическая доступность
  5. Благодать доступа
  6. В остальных случаях, Представитель не участвует в поиске новых клиентов, но может отправлять ссылку на свой магазин клиентам, который будет доступен для заказа.
  7. В126 Доступык почке и мочеточнику.

//////////////////////////////////////////////////

// Random.cpp: Демонстрация файла с произвольным доступом.

//

#include <fstream.h>

#include <iomanip.h>

#pragma hdrstop

#include <condefs.h>

const int NP = 10;

const int IS = sizeof(int);

#pragma argsused

int main(int argc, char* argv[])

{

int pt, i;

//

// Открытие файла для чтения/записи.

//

fstream fs("random.pts",

ios::binary | ios::in | ios::out | ios::trunc);

if (ifs) {

cerr << "Failed to open file." << endl;

return (1);

}

//

// Первоначальная запись файла.

//

cout << "Initial data:" << endl;

for (i=0; i<NP; i++){

pt = i;

fs.write((char*)&pt, IS);

cout << setw(4) << pt;

}

cout << endl << endl;

//

// Чтение файла от конца к началу.

//

cout << "Read from the file in reverse order:"<< endl;

for (i=0; i<NP; i++) {

fs.seekg(-(i + 1) * IS, ios::end);

fs.read((char*)&pt, IS);

cout “ setw(4)<< pt;. }

cout<< end1 << end1;

//

// Переписать четные индексы.

//

for (i=l; i<NP/2; i++) {

fs.seekg(2 * i * IS);

fs.read((char*)&pt, IS);

pt = -pt;

fs.seekg(fs.tellg () - IS); // Возврат на шаг.

fs.write((char*)&pt, IS);

}

//

// Распечатать файл.

//

cout << "After rewriting the even records:"<<endl;

fs.seekg(0);

for (i=0; i<NP; i++) {

fs.read((char*)&pt, IS);

cout << setw(4) << pt;

}

cout << endl;

fs.close ();

return 0;

}

Примечание

Когда эта программа открывает уже существующий файл, он усекается до нулевой длины (т. е. все его данные теряются). Если вы хотите работать с имеющимися в файле данными, нужно убрать бит ios::trunc из режима открытия потока. Кстати, в примере это можно сделать безболезненно — данные файла все равно сразу переписываются заново.

В этом примере мы пользовались для позиционирования потока функцией seekg (). Но поскольку поток у нас типа f stream, и открыт он в режиме чтения-записи, то все равно, какую функцию применять для позиционирования — seekg () или seekp ().

Примечание

He следует упускать из виду, что при выполнении операций бесформатного чтения или записи (read/write) указатель потока сдвигается вперед на число прочитанных (записанных) байтов. Вывод программы показан на рис. 4.

Рис. 4 Программа Random

Заключение

Аппарат потоковых классов библиотеки C++ довольно громоздок, если сравнивать его, например, с функциями языка С вроде printf (). Однако средства потоков C++ единообразны, надежны и расширяемы. Как вы узнали из этой главы, можно достаточно просто перегрузить операции извлечения и передачи, чтобы с точки зрения потоков ввода-вывода определенный вами тип выглядел бы подобно встроенным типам данных.


Дата добавления: 2015-07-11; просмотров: 112 | Нарушение авторских прав


Читайте в этой же книге: Операции извлечения и передачи в поток | Листинг 1. Демонстрация форматирующих функций потока | Листинг 2. Форматирование с помощью манипуляторов | Листинг 3. форматирующие флаги потоков | Файловые потоки |
<== предыдущая страница | следующая страница ==>
Бесформатный ввод-вывод| Мы напрямую выходили к Бугаю. Он нас «отфутболивает», будем так говорить. Вот у нас бумаги, могу вам показать даже.

mybiblioteka.su - 2015-2024 год. (0.006 сек.)