Пропустить в стандартном потоке ввода / вывода [дубликат]

Просто измените функцию:

def notastonishinganymore(a = []): '''The name is just a joke :)'''
    a = a[:]
    a.append(5)
    return a
2
задан cheng 21 September 2011 в 08:11
поделиться

5 ответов

Я не знаю, будет ли сброшен буфер, может быть, нет, если вы попытаетесь достаточно близко подойти к позиции. Однако нет способа, чтобы буферные данные были записаны в новую позицию. Буферизация - это просто оптимизация, и поэтому она должна быть прозрачной.

2
ответ дан K-ballo 21 August 2018 в 10:53
поделиться
  • 1
    Итак, вы имеете в виду, что такие вызовы в порядке: (1) fwrite ... (2) fseek ... (3) fwrite ... и все данные будут в правильном положении? – cheng 21 September 2011 в 08:17
  • 2
    Да, вы можете быть уверены, что fseek будет работать так же, как если бы не было буферизации вообще. – K-ballo 21 September 2011 в 08:18
  • 3
    Можете ли вы привести текст в стандарте C для поддержки этого представления? (Я считаю, что это неверно, но у меня нет моей копии стандарта C здесь, чтобы проверить.) И буферизация, конечно же, не «просто оптимизация»; многие аспекты буферизации покрываются стандартом (например, fflush, setbuf и т. д.), – James Kanze 21 September 2011 в 08:35

Я не считаю, что указано, что данные должны быть сброшены на fseek, но когда данные фактически записаны на диск, они должны быть записаны в том положении, в котором был поток, когда была вызвана функция записи. Даже если данные все еще буферизованы, этот буфер не может быть записан в другую часть файла, когда он сбрасывается, даже если последует поиск.

1
ответ дан CB Bailey 21 August 2018 в 10:53
поделиться

У меня смутные воспоминания о требовании, которое вы называете fflush до fseek, но у меня нет моей копии стандарта C, доступного для проверки. (Если вы этого не сделаете, это будет определено неопределенное поведение или реализация, или что-то в этом роде.) Общий стандарт Unix указывает, что:

Если самая последняя операция, отличная от ftell () на данном потоке - fflush (), смещение файла в описании открытого файла должно быть скорректировано с учетом местоположения, указанного fseek ().

[...]

Если поток записывается и данные буферизации не были записаны в базовый файл, fseek () приведет к записи неписаных данных в файл и отметит поля st_ctime и st_mtime файла для обновления.

< / blockquote>

Это отмечено как расширение стандарта ISO C, поэтому вы не можете рассчитывать на него, кроме как на платформах Unix (или на других платформах, которые предоставляют аналогичные гарантии).

0
ответ дан James Kanze 21 August 2018 в 10:53
поделиться
  • 1
    рассмотрите, например, 7.19.5.3/6: «Выход не должен напрямую сопровождаться вводом без промежуточного вызова функции fflush или функции позиционирования файла (fseek, fsetpos или перемотка назад)». Это не является окончательным, но если бы потребовалось называть fflush после выхода и до fseek, то это упоминание fseek было бы излишним, так как в любом случае будет флеш. – Steve Jessop 21 September 2011 в 09:42
  • 2
    @Steve Это может быть ограничение, о котором я думал ... как я сказал, я смутно помню требование называть 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 не работает.

2
ответ дан Jonathan Leffler 21 August 2018 в 10:53
поделиться
  • 1
    Он действительно спрашивает о fseek(). – K-ballo 21 September 2011 в 08:14
  • 2
    Учитывая текст вашего ответа и раздел, который вы цитировали, вы говорите, что fseek должен делать эквивалент fflush? Мне это было не совсем понятно. – CB Bailey 21 September 2011 в 08:18

Кажется, что ваша реальная проблема заключается в том, что ранее написанные (но еще не покрасневшие) данные оказались бы в неправильном месте в файле, если вы сделаете fseek.

Нет, это выиграло Слушай. Он будет вести себя так, как вы ожидали.

1
ответ дан NPE 21 August 2018 в 10:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: