Просто измените функцию:
def notastonishinganymore(a = []): '''The name is just a joke :)'''
a = a[:]
a.append(5)
return a
Я не знаю, будет ли сброшен буфер, может быть, нет, если вы попытаетесь достаточно близко подойти к позиции. Однако нет способа, чтобы буферные данные были записаны в новую позицию. Буферизация - это просто оптимизация, и поэтому она должна быть прозрачной.
Я не считаю, что указано, что данные должны быть сброшены на fseek
, но когда данные фактически записаны на диск, они должны быть записаны в том положении, в котором был поток, когда была вызвана функция записи. Даже если данные все еще буферизованы, этот буфер не может быть записан в другую часть файла, когда он сбрасывается, даже если последует поиск.
У меня смутные воспоминания о требовании, которое вы называете fflush
до fseek
, но у меня нет моей копии стандарта C, доступного для проверки. (Если вы этого не сделаете, это будет определено неопределенное поведение или реализация, или что-то в этом роде.) Общий стандарт Unix указывает, что:
Если самая последняя операция, отличная от ftell () на данном потоке - fflush (), смещение файла в описании открытого файла должно быть скорректировано с учетом местоположения, указанного fseek ().
[...]
Если поток записывается и данные буферизации не были записаны в базовый файл, fseek () приведет к записи неписаных данных в файл и отметит поля st_ctime и st_mtime файла для обновления.
< / blockquote>Это отмечено как расширение стандарта ISO C, поэтому вы не можете рассчитывать на него, кроме как на платформах Unix (или на других платформах, которые предоставляют аналогичные гарантии).
fflush
после выхода и до fseek
, то это упоминание fseek
было бы излишним, так как в любом случае будет флеш.
– Steve Jessop
21 September 2011 в 09:42
fflush
, но у меня нет моей копии стандарта, удобного для проверки где он был (и поскольку я обычно использую только C ++ I / O, я не помню C стиль IO).
– James Kanze
21 September 2011 в 10:21
Да; fseek()
гарантирует, что файл будет выглядеть так, как должен, в соответствии с выполненными вами операциями fwrite()
.
Стандарт C, ISO / IEC 9899: 1999 §7.19.9.2 fseek()
, говорит :
Функция fseek устанавливает индикатор позиции файла для потока, на который указывает поток. Если возникает ошибка чтения или записи, отображается индикатор ошибки для потока, и fseek не работает.
blockquote>
fseek
должен делать эквивалент fflush
? Мне это было не совсем понятно.
– CB Bailey
21 September 2011 в 08:18
Кажется, что ваша реальная проблема заключается в том, что ранее написанные (но еще не покрасневшие) данные оказались бы в неправильном месте в файле, если вы сделаете fseek
.
Нет, это выиграло Слушай. Он будет вести себя так, как вы ожидали.
fseek
будет работать так же, как если бы не было буферизации вообще. – K-ballo 21 September 2011 в 08:18fflush
,setbuf
и т. д.), – James Kanze 21 September 2011 в 08:35