Странное поведение при поиске файлов

Что касается двух взаимодействий, приведенных ниже, я ожидаю, что оба файла будут выводить один и тот же файл, но второе будет записано в конце файла. Разница лишь в том, что оператор read после записи не понимает, что происходит. Что мне не хватает?

Ожидаемое поведение:

>>> f = open("test.txt","w+")
>>> f.write('0123456789')
10
>>> f.seek(0)
0
>>> f.read(3)
'012'
>>> f.seek(0,1)
3
>>> f.write('XX')
2
>>> f.seek(0)
0
>>> f.read()
'012XX56789'
>>> f.close()

Неожиданное поведение:

>>> f = open("test.txt","w+")
>>> f.write('0123456789')
10
>>> f.seek(0)
0
>>> f.read(3)
'012'
>>> f.seek(0,1)
3
>>> f.write('XX')
2
>>> f.read(2)
'34'
>>> f.seek(0)
0
>>> f.read()
'0123456789XX'
>>> f.close()

Как вы можете видеть, XX был написан после всей строки, когда я был на позиции 3, когда писал эти символы.

Ответы

Ответ 1

Случилось так, что write был буферизован, а промежуточный read продвинул позицию основного файла до конца файла (с момента его небольшого размера) до того, как запись была зафиксирована (очищена). Если то, что следует за записью, является seek, буфер записи фиксируется (в нужном месте) перед фактическим поиском. Этот подход позволяет избежать накладных расходов при каждом чтении для проверки ожидающих записей и долгое время был определен POSIX.