Вопрос № 171531: Здравствуйте эксперты, подскажите пожалуйста: 1)Работаю с файлом в двоичном режиме. Как можно установить в файле место чтения в файле, или место записи. В Паскале была команда Seek для типизированных файлов, и можно было считать любую запись, а...
Вопрос № 171531:
Здравствуйте эксперты, подскажите пожалуйста: 1)Работаю с файлом в двоичном режиме. Как можно установить в файле место чтения в файле, или место записи. В Паскале была команда Seek для типизированных файлов, и можно было считать любую запись, а не все подряд, как здесь мне это сделать 2)Как узнать размер файла?
Отвечает Micren, Бакалавр :
Здравствуйте, Tribak. В потоковых классах наследников basic_ostream есть методы seekp(),tellp(), позволяющие установить указатель записи в требуемую позицию, в наследниках basic_istream есть методы seekg(),tellg(). Благодаря множественному наследованию, в классах потомках от basic_iostream есть как методы для установки указателя чтения, так и записи.
Код:
#include <fstream> #include <iostream>
using namespace std;
// Тестовая структура class demo_struct { public: demo_struct(int no=0,double d=0) :_no(no) ,_d(d) { } private: int _no; double _d;<
br> template<class _Elem> friend basic_ostream<_Elem>& operator<<(basic_ostream<_Elem>& stream,demo_struct& r); };
int main() { // Открываем двоичный поток для чтения/записи fstream stream("e:\\demo",ios::in|ios::out|ios::binary|ios::trunc);
//
Пишем 4 структуры stream.write(reinterpret_cast<char*>(&demo_struct(1,0.1)),sizeof(demo_struct)); stream.write(reinterpret_cast<char*>(&demo_struct(2,0.2)),sizeof(demo_struct)); stream.write(reinterpret_cast<char*>(&demo_struct(3,0.3)),sizeof(demo_struct)); stream.write(reinterpret_cast<char*>(&demo_struct(4,0.4)),sizeof(demo_struct)); stream.write(reinterpret_cast<char*>(&demo_struct(5,0.5)
),sizeof(demo_struct));
stream.flush();
// Установим указатель на конец потока stream.seekg(0,ios::end); // Получим значение указателя. Это размер потока. streamoff size=stream.tellg(); cout<<"size="<<size<<endl;
// Указатель чтения на 3-ю запись stream.seekg(sizeof(demo_struct)*2);
* Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи.
(полный список тарифов)
** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
*** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.