С++ для начинающих



         

Файловый ввод/вывод - часть 5


seekg( off_type offset_position, ios_base::seekdir dir );

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

abc def ghi jkl

то вызов

io.seekg( 6 );

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

  • ios_base::beg – от начала файла;
  • ios_base::cur – от текущей позиции;
  • ios_base::end – от конца файла.
  • В следующем примере каждый вызов seekg() позиционирует файл на i-ую запись:

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

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

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

    readFile.seekg( -10, ios_base::cur );

    Текущая позиция чтения в файле типа fstream возвращается любой из двух функций-членов tellg() или tellp(). Здесь 'p' означает запись (putting) и используется с объектом ofstream, а 'g' говорит о чтении (getting) и обслуживает объект ifstream:

    // сохранить текущую позицию

    ios_base::pos_type mark = writeFile.tellp();

    // ...

    if ( cancelEntry )

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

       writeFile.seekp( mark );

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

    // эквивалентные вызовы seekg

    readFile.seekg( readFile.tellg() + sizeof(Record) );

    // данный вызов считается более эффективным

    readFile.seekg( sizeof(Record), ios_base::cur );

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




    Содержание  Назад  Вперед