Код: Выделить всё
#include
#include
using std::fstream;
int main()
{
fstream file("text.txt", ios::out| ios::in |ios::trunc| ios::binary);
if (!file)
throw"ERROR\n";
char y = 't';
streampos get = file.tellg(); // (static_cast(get) == 0)
streampos put = file.tellp(); // (static_cast(put) == 0)
file.write(&y, sizeof(y)); // I'd assume that it will increment *only* the putting
cursor
get = file.tellg(); // Assumingly, the getting cursor will remain the same:
// (static_cast(get) == 0) . In reality: (static_cast(get) == 1)
put = file.tellp(); // Assumingly and in reality: (static_cast(put) == 1)
return 0;
}
Я пытался найти ответы, почему это происходит, но лучшее, что мне удалось найти, это: . В котором говорится:
Оба searchg и seekp имеют одинаковый эффект; использование одного из них меняет положение другого.
это:
Кстати, повторный поиск и поиск не нужны. Чтобы изменить режимы, вам нужно установить положение только один раз.
Но эти ответы просто отмечают поведение, а я этого не делаю. Не могу понять причину такого поведения. Потому что почему файл fstream, открытый для входных и выходных потоков, имеет один курсор для двух потоков?
Также есть
этот ответ:
На индикатор позиции, который отмечает текущую позицию в файле, влияют как операции ввода, так и операции вывода.
< blockquote>
Когда вы выполняете чтение после записи или наоборот, поток должен быть перемещен обратно.
Что я и сделал тоже хотелось бы получить объяснение. Потому что, помимо того, что отмечают другие ответы, в этом ответе также отмечается:
Если операция ввода достигает конца файла, выполняется запись непосредственно после этого - нормально.
Это тоже не имеет смысла, потому что он говорит, что чтение сразу после конца файла - это нормально. ..
Все это для меня непонятно. Поэтому мой вопрос: почему fstream работает именно так? Почему при поддержке двух направлений потока имеется только один курсор?
Спасибо.
Подробнее здесь: https://stackoverflow.com/questions/787 ... technicall
Мобильная версия