Программирование >>  Инициализация объектов класса, структура 

1 ... 350 351 352 [ 353 ] 354 355 356 ... 395


#include <fstream> #include WordCount.h

int main() {

WordCount wd;

fstream file;

file.open( word.out , ios::in );

file >> wd; file.close();

cout << Прочитано: << wd << endl;

операция ios base::out стерла бы текущие данные file.open( word.out , ios::app );

file << endl << wd << endl;

file.close();

Объект класса fstream может также открывать файл одновременно для ввода и вывода. Например, приведенная инструкция откр1вает файл word.out для ввода и дозаписи:

fstream io( word.out , ios base::inios base::app );

Для задания нескольких режимов используется оператор побитового ИЛИ. Объект класса fstream можно позиционировать с помощью функций-членов seekg () или seekp(). Здесь буква g обозначает позиционирование для чтения (getting) символов (используется с объектом класса ofstream), а p - для записи (putting) символов (используется с объектом класса ifstream). Эти функции делают текущим тот байт в файле, который

установить абсотное смещение в файле seekg( pos type current position )

смещение от текущей позиции в том или ином направлении

имеет указанное абсолютное или относительное смещение. У них есть два варианта:

seekg( off type offset position, ios base::seekdir dir );

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

abc def ghi jkl

то вызов

io.seekg( 6 );

позиционирует io на шестой символ, т.е. на f. Второй вариант устанавливает указатель рабочей позиции файла на заданное расстояние от текущей, от начала файла или от его конца в зависимости от аргумента dir, который может принимать следующие значения:



for ( int i = 0; i < recordCnt; ++i )

В следующем примере каждый вызов seekg() позиционирует файл на i-ую запись:

readFile.ssekg( i * sizeof(Record), ios base::beg );

С помощью первого аргумента можно задавать отрицательное значение. Переместимся на 10 байтов назад от текущей позиции:

readFile.seekg( -10, ios base::cur );

Текущая позиция чтения в файле типа fstream возвращается любой из двух функций-членов tellg() или tellp(). Здесь p означает запись (putting) и используется с

сохранить текущую позицию ios base::pos type mark = writeFile.tellp();

...

if ( cancelEntry )

вернуться к сохраненной позиции

объектом ofstream, а g говорит о чтении (getting) и обслуживает объект ifstream:

writeFile.seekp( mark );

Если необходимо сместиться вперед от текущей позиции на одну запись типа Record, то

эквивалентнхе вызовы see kg

readFile.seekg( readFile.tellg() + sizeof(Record) ); данный вызов считается более эффективным

можно воспользоваться любой из данных инструкций:

readFile.seekg( sizeof(Record), ios base::cur );

Разберем реальный пример. Дан текстовый файл, нужно вычислить его длину в байтах и сохранить ее в конце файла. Кроме того, каждый раз при встрече символа новой строки требуется сохранить текущее смещение в конце файла. Вот наш текстовый файл:

abcd efg

Программа должна создать файл, модифицированный следующим образом:

ios base::beg - от начала файла;

ios base::cur - от текущей позиции;

ios base::end - от конца файла.



abcd

5 9 12 14 24

#include <iostream> #include <fstream>

main() {

открыть файл для ввода и дозаписи

fstream inOut( copy.out , ios base::inios base::app );

int cnt = 0; счетчик байтов char ch;

while ( inOut.get( ch ))

cout.put( ch ); скопировать на терминал ++cnt;

if ( ch == \n ) {

inOut << cnt ;

inOut.put( ); пробел

вывести окончательное значение счетчика байтов inOut << cnt << endl; cout << [ << cnt << ] << endl; return 0;

Так выглядит первая попытка реализации:

inOut - это объект класса fstream, связанный с файлом copy.out, открытым для ввода и дозаписи. Если файл открыт в режиме дозаписи, то все новые данные записываются в конец.

При чтении любого (включая пробельн1е) символа, кроме конца файла, mi увеличиваем переменную cnt на 1 и копируем прочитанный символ на терминал, чтобы вовремя заметить ошибки в работе программы.

Встретив символ новой строки, мы записываем текущее значение cnt в inOut. Как только будет достигнут конец файла, цикл прекращается. Окончательное значение cnt выводится в файл и на экран.

Программа компилируется без ошибок и кажется правильной. Но если подать на вход несколько фраз из романа Моби Дик Германа Мелвилла:

Call me Ishmael. Some years ago, never mind how long precisely, having little or no money in my purse, and nothing particular to interest me on shore, I thought I would sail about a little and see the watery part of the world. It is a way I have of driving off the spleen, and regulating the circulation.

то получим такой результат:



1 ... 350 351 352 [ 353 ] 354 355 356 ... 395

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика