Почему printf не сбрасывается после вызова, если новая строка не находится в строке формата?

http://docs.python.org/library/os.path.html#os.path.abspath

также соединяют путь и нормальный путь, в зависимости от того, re в текущем рабочем каталоге, или вы работаете с вещами в другом месте. normpath может быть более прямым для вас.

Обновление:

в частности:

os.path.normpath( 
  os.path.join( 
    os.path.dirname( '/etc/fonts/conf.d/70-yes-bitmaps.conf' ), 
    os.readlink('/etc/fonts/conf.d/70-yes-bitmaps.conf') 
  ) 
)

486
задан K DawG 24 July 2018 в 17:18
поделиться

7 ответов

Поток stdout по умолчанию буферизируется по строкам, поэтому будет отображать то, что находится в буфере, только после того, как он достигнет новой строки (или когда будет указано). У вас есть несколько вариантов для немедленной печати:

Печать на stderr вместо использования fprintf ( stderr - по умолчанию не буферизуется ):

fprintf(stderr, "I will be printed immediately");

Сбрасывайте стандартный вывод всякий раз, когда он вам нужен, используя fflush :

printf("Buffered, will be flushed");
fflush(stdout); // Will now print everything in the stdout buffer

Изменить : из комментария Энди Росс ниже, вы также можете отключить буферизацию на стандартном выводе с помощью setbuf :

setbuf(stdout, NULL);
672
ответ дан 22 November 2019 в 22:33
поделиться

Обычно существует 2 уровня буферизации -

1. Кэш-буфер ядра (делает чтение-запись быстрее)

2. Буферизация в библиотеке I/O (уменьшает нет. из системных вызовов)

Позволяют нам взять пример fprintf and write().

, Когда Вы звоните fprintf(), это не пишет непосредственно в файл. Это сначала переходит к буферу stdio в памяти программы. Оттуда это записано в кэш-буфер ядра при помощи системного вызова записи. Таким образом, один способ пропустить буфер ввода-вывода непосредственно использует запись (). Другие пути при помощи setbuff(stream,NULL). Это устанавливает режим буферизации ни на какую буферизацию, и данные непосредственно записаны в буфер ядра. Для мощного создания данных, которые будут смещены к буферу ядра, мы можем использовать "\n", который в случае режима буферизации значения по умолчанию 'буферизации строки', сбросит буфер ввода-вывода. Или мы можем использовать fflush(FILE *stream).

Теперь мы находимся в буфере ядра. Ядро (/ОС) хочет минимизировать время доступа к диску, и следовательно это читает/пишет только блоки диска. Таким образом, когда read() выпущен, который является системным вызовом и может быть вызван непосредственно или до fscanf(), ядро читает дисковый блок из диска и хранит его в буфере. После того, как те данные копируются отсюда до пространства пользователя.

Так же, что fprintf() данные, полученные от буфера ввода-вывода, записаны в диск ядром. Это делает чтение () записью () быстрее.

Теперь, чтобы вынудить ядро инициировать write(), после которого передачей данных управляют аппаратные контроллеры, существуют также некоторые пути. Мы можем использовать O_SYNC или подобные флаги во время вызовов записи. Или мы могли использовать другие функции как fsync(),fdatasync(),sync() для создания записей новичка ядра, как только данные доступны в буфере ядра.

2
ответ дан 22 November 2019 в 22:33
поделиться

Это, вероятно, так из-за эффективности и потому, что если у вас есть несколько программ, записывающих в один TTY, таким образом вы не получите символы в строке с чересстрочной разверткой. Итак, если программа A и B выводят, вы обычно получите:

program A output
program B output
program B output
program A output
program B output

Это воняет, но лучше, чем

proprogrgraam m AB  ououtputputt
prproogrgram amB A  ououtputtput
program B output

. Обратите внимание, что даже не гарантируется сброс на новую строку, поэтому вы должны явно сбросить, если сброс имеет значение вам.

28
ответ дан 22 November 2019 в 22:33
поделиться

Для немедленной очистки вызова fflush (stdout) или fflush (NULL) ( NULL означает сброс все).

24
ответ дан 22 November 2019 в 22:33
поделиться

stdout буферизируется, поэтому будет выводиться только после печати новой строки.

Чтобы получить немедленный вывод, либо:

  1. Печать в stderr.
  2. Сделайте stdout без буферизации.
11
ответ дан 22 November 2019 в 22:33
поделиться

Вместо этого вы можете fprintf использовать stderr, который не буферизован. Или вы можете очистить стандартный вывод, когда захотите. Или вы можете установить для стандартного вывода значение без буферизации.

10
ответ дан 22 November 2019 в 22:33
поделиться

по умолчанию, stdout буферизуется по строкам, stderr не буферизуется, а файл полностью буферизуется.

11
ответ дан 22 November 2019 в 22:33
поделиться
Другие вопросы по тегам:

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