|
Программирование >> Инициализация объектов класса, структура
#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. то получим такой результат:
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |