Подтвердить что ты не робот

Являются "seekp" и "seekg" взаимозаменяемыми?

Ну, я просто заметил, что, изменяя позицию - в Microsoft Visual Studio - через "seekp", я неявно также изменяю позицию чтения при обработке файлов.

Мне интересно, если это "портативное" поведение? Могу ли я ожидать, что позиция чтения и письма всегда будет одинаковой? И поэтому: tellp и tellg всегда возвращают одно и то же значение?

4b9b3361

Ответ 1

Для позиций файлов они одинаковы. Другими словами, поддерживается только один указатель.

От 27.9.1.1p3:

Совместное положение файла сохраняется как для входной последовательности, так и для последовательность вывода.

Итак, seekg и seekp взаимозаменяемы для файловых потоков. Однако это не относится к другим типам потоков, поскольку они могут содержать отдельные указатели для позиций put и get.

Ответ 2

Обновление: Итак, из всех комментариев и всего, кажется, что для fstream, seekp и seekg используют один и тот же указатель. Но для потоков строк и, возможно, других потоков, не связанных с файлами, они являются отдельными.


Оригинальное сообщение:

Не работает для меня на linux с g++ 4.7.2. Они кажутся независимыми:

#include <sstream>
#include <iostream>

int main(int, char**) {
    std::stringstream s("0123456789");
    std::cout << "put pointer: " << s.tellp() << std::endl;
    std::cout << "get pointer: " << s.tellg() << std::endl;
    std::cout << std::endl;
    s.seekp(2);
    std::cout << "put pointer: " << s.tellp() << std::endl;
    std::cout << "get pointer: " << s.tellg() << std::endl;
    std::cout << std::endl;
    s.seekg(4);
    std::cout << "put pointer: " << s.tellp() << std::endl;
    std::cout << "get pointer: " << s.tellg() << std::endl;
    std::cout << std::endl;
}

Вывод:

put pointer: 0
get pointer: 0

put pointer: 2
get pointer: 0

put pointer: 2
get pointer: 4

Также поведение, которое вы описываете, похоже на то, что оно не соответствует цитатам здесь:

Устанавливает позицию указателя get. Указатель get определяет следующее место для чтения в источнике, связанном с потоком.

и здесь:

Устанавливает позицию указателя put. Указатель put определяет местоположение в выходной последовательности, где будет выполняться следующая операция вывода место.