Синтаксис и параметры функции Seekg() в C++
Seekg() может быть реализован с помощью двух синтаксисов:
1. Синтаксис Streampos
транслировать & искать ( пост на стримпосе ) ;Этот синтаксис принимает только один параметр — позицию, который представляет положение курсора в буфере потока. Он представляет собой значение «int» типаstreampos.
2. Синтаксис смещения и направления
транслировать & искать ( стримить часто , ios_base :: искать это грязь ) ;Этот синтаксис принимает на вход два параметра: смещение и направление. Параметр «ofst» — это целое число типаstreamoff, которое указывает смещение в буфере потока. Параметр «грязь» ищет направление.
- ios_base::beg: Смещение от самого начала буфера потока.
- ios_base::cur: смещение от текущей позиции в буфере потока.
- ios_base::end: смещение от последней части буфера потока.
Функция searchg() в C++ манипулирует указателем файла, позволяя программисту поместить его в определенное место внутри файла. Он возвращает модификацию объекта «istream» (*this) и соответствующим образом корректирует указатель файла.
Обработка ошибок и исключений в функции C++ Seekg()
Функция searchg() в C++ обеспечивает базовую гарантию обработки исключений, сохраняя корректность объекта в случае возникновения исключения. Она может генерировать исключения «сбоя», когда флагу состояния ошибки не хватает информации, и функция ответственно перехватывает и управляет этими исключениями, повторно выдавая их, если при последнем вызове был установлен плохой бит.
Более того, распространенная проблема с seekg() возникает, когда он достигает конца файла (EOF), в результате чего указатель остается неустановленным и вызывает ошибку. Метод Clear() используется для сброса указателя и устранения ошибок, связанных с EOF. Кроме того, seekg() может рисковать изменением объекта потока в многопоточной среде, что требует осторожности и реализации механизмов синхронизации для смягчения потенциальных изменений объекта «вне потока».
Пример 1: Основы Seekg()
В первом примере мы объясним основы функции searchg() в C++. Код программы на C++ приведен ниже. Сначала взгляните на него, а затем мы перейдем к объяснению каждого раздела кода.
#include
#include
использование пространства имен std ;
интервал основной ( интервал аргк , голец ** аргв ) {
fstream sgFile ( 'seekgFile.txt' , iOS :: в | iOS :: вне | iOS :: ствол ) ;
sgFile << 'функция поиска()' ;
sgFile. искать ( 8 , iOS :: очень прошу ) ;
голец sgArray [ 8 ] ;
sgFile. читать ( sgArray , 8 ) ;
sgArray [ 8 ] '=' 0 ;
расчет << sgArray << конец ;
sgFile. закрывать ( ) ;
}
Программа включает в себя два необходимых заголовочных файла —
fstream sgFile('seekgFile.txt', ios::in | ios::out | ios::trunk); – Здесь создается «sgFile», объект класса «fstream», представляющий файловый поток. Файл с именем «seekgFile.txt» связан с файловым потоком. Файловый поток открывается для ввода (ios::in) и вывода (ios::out). Если файл существует, его содержимое усекается (ios::trunc).
sgFile << «функция Seekg()»; – Строка «функции Seekg()» записывается в файл с помощью оператора «<<».
sgFile.seekg(8, ios::beg); – Функция seekg() используется для установки указателя get на 8-ю позицию от начала (ios::beg) файла.
sgFile.read(sgArray, 8); – Функция «read» используется для чтения восьми символов из текущей позиции указателя get в «sgArray».
sgArray[8] = 0; – Null завершает массив символов, чтобы обеспечить правильную обработку строк.
cout << sgArray << endl; – Содержимое «sgArray» (8 символов, считанных из файла) отображается на консоли с помощью cout.
сгФайл.закрыть(); – Функция close() используется для закрытия файлового потока.
Ожидается, что результатом этой программы будет «функция». Давайте проверим это в следующем фрагменте вывода:
Код создает файловый поток, связанный с файлом «seekgFile.txt», записывает строку в файл, ищет 8-ю позицию с начала, считывает восемь символов и выводит прочитанное содержимое. Наконец, файловый поток закрывается.
Пример 2: Динамическая навигация
Рассмотрим сценарий, в котором вам необходимо динамически вычислять смещение seekg(). Давайте разберемся, как динамически вычислять смещение, с помощью примера кода.
#include#include
использование пространства имен std ;
интервал основной ( ) {
ifstream sgFile ( 'seekgFile.txt' ) ;
интервал компенсировать '=' 8 ;
sgFile. искать ( компенсировать , iOS :: помещать ) ;
голец буфер [ 8 ] ;
sgFile. читать ( буфер , 8 ) ;
расчет << 'Содержание: ' << буфер << конец ;
sgFile. закрывать ( ) ;
возвращаться 0 ;
}
Как видите, мы читаем содержимое из того же файла, который мы создали в предыдущем примере, «seekgFile.txt». Функция seekg() устанавливает указатель get в текущую позицию (ios::cur) в файле и перемещает его на вычисленное смещение (8 символов). Функция read() считывает восемь символов из текущей позиции указателя get в буфер.
Учитывая содержимое файла функции Seekg() и смещение в восемь символов, программа выведет подстроку, начинающуюся с 9-го символа файла. Следовательно, ожидаемым результатом программы является «функция». Подтвердим это в следующем выводе:
Этот пример демонстрирует гибкость searchg() за счет динамического расчета смещения.
Пример 3: Навигация с конца
В этом примере мы покажем, как читать данные в файле с конца файла. Здесь seekg() используется для перехода от конца файла. Отрицательное смещение указывает на позицию относительно конца. См. следующий код:
#include#include
использование пространства имен std ;
интервал основной ( ) {
ifstream sgFile ( 'seekgFile.txt' ) ;
sgFile. искать ( - 4 , iOS :: конец ) ;
голец буфер [ 8 ] ;
sgFile. читать ( буфер , 8 ) ;
расчет << 'Содержание: ' << буфер << конец ;
sgFile. закрывать ( ) ;
возвращаться 0 ;
}
Эта программа на C++ открывает файл с именем «seekgFile.txt», который перемещает указатель получения на четыре символа назад от конца файла с помощью sgFile.seekg(-4, ios::end), считывает следующие восемь символов из этой позиции в буфер, а затем выводит содержимое буфера на консоль. Учитывая содержимое файла как «функцию Seekg()», ожидаемый результат — «действие». Давайте сопоставим вывод на скриншоте со следующим выводом:
Заключение
Подводя итоги, seekg() становится ценным инструментом для точной навигации по файловым потокам. Благодаря своей способности искать произвольные позиции, динамически вычислять смещения и перемещаться из разных точек в файле, seekg() позволяет разработчикам эффективно обрабатывать файловые операции. Как мы видели в примерах, освоение функции searchg() повышает контроль и гибкость при работе с файловыми потоками в C++. Однако для обеспечения надежных и безошибочных операций с файлами в C++ требуется тщательное рассмотрение обработки исключений и потенциальных сценариев гонки данных.