Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Позиционирование в потоке


Автор: BEOWOLF 9.4.2008, 07:05
Имеется некоторый файл, в конце файла записана служебная инфа длиной в 8 байт. Необходимо открыть этот файл для дальнейшего дописывания через std::ofstream, не затирая всего содержимого, сместить от конца на 8 байт назад, переписать эту инфу на другую, после чего дописывать файл. Проблема состоит в том, что используя поток это сделать почему-то никак не выходит. У меня код выглядит так:
Код

std::ofstream RecStream( m_FileName.c_str(), std::ios_base::ate | std::ios_base::binary | std::ios_base::out );
RecStream.seekp( 0 - 2*sizeof(__int32), std::ios_base::end );
но после этого tellp() почему-то возвращает -1, и ничего не пишет. если std::ios_base::ate заменить на std::ios_base::app, то тогда файл дописывается, но старая инфа в 8 байт не переписывается. если std::ios_base::ate вообще убрать, то по-прежнему в файл ничего не пишется. Что посоветуете сделать?
п. с. использую VS2005.

Автор: Earnest 9.4.2008, 09:29
app точно не годится, т.к. переставляет указатель в конец при каждой записи.
Насчет ate - не знаю, не пробовала, а вот без них должно работать: просто открыть как бинарный, переставить указатель на позицию длина файла - 8 или как у тебя, -8 от конца. Причем выражение  0 - 2*sizeof(__int32) выглядит как-то сомнительно - ты бы сходил внутрь отладчиком и посмотрел, чему аргумент равен; да и зачем так извращаться.
out, кстати, тоже не нужен - ofstream его подрузумевает.

Автор: baldina 9.4.2008, 13:48
Код

std::ios_base::binary | std::ios_base::in

иначе либо затирает файл либо всегда в конец позиционируется.

Добавлено через 1 минуту и 43 секунды
либо fstream используй, там ничего лишнего за тебя не добавят

Автор: BEOWOLF 9.4.2008, 16:01
спасибо, вариант с
Код

std::ios_base::binary | std::ios_base::in
отлично работает, как раз то что надо smile  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)