Являются "seekp" и "seekg" взаимозаменяемыми?
Ну, я просто заметил, что, изменяя позицию - в Microsoft Visual Studio - через "seekp", я неявно также изменяю позицию чтения при обработке файлов.
Мне интересно, если это "портативное" поведение? Могу ли я ожидать, что позиция чтения и письма всегда будет одинаковой? И поэтому: tellp
и tellg
всегда возвращают одно и то же значение?
Ответы
Ответ 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 определяет местоположение в выходной последовательности, где будет выполняться следующая операция вывода место.