Что касается того, когда использовать один по другому, возьмите, например, эти fwrite()
функция в PHP.
Эта функция пишет содержание в поток файла. Согласно PHP, "fwrite()
возвраты число записанных байтов, или ЛОЖНЫХ на ошибке".. Если Вы хотите протестировать, если вызов функции был успешен, этот метод испорчен:
if (!fwrite(stuff))
{
log('error!');
}
Это может возвратить нуль (и считается успешным), и Ваше условие все еще инициировано. Правильный путь был бы:
if (fwrite(stuff) === FALSE)
{
log('error!');
}
Вы можете получить желаемый результат как для терминала, так и для каналов, если вы не забудете также удалить управляющие символы. Это жестко запрограммировано для двух строк.
#include <stdio.h>
int
main ()
{
fputs("output1\n",stdout);
fputs("output2\n",stdout);
fputs("\033[A\033[2K\033[A\033[2K",stdout);
rewind(stdout);
ftruncate(1,0); /* you probably want this as well */
fputs("output3\n",stdout);
fputs("output4\n",stdout);
return 0;
}
Most terminals support ANSI escape codes. You can use a J (with parameter 2) to clear the screen and an H (with parameters 1,1) to reset the cursor to the top-left:
printf("\033[2J\033[1;1H");
Alternatively, a more portable solution would be to use a library such as ncurses, which abstracts away the terminal-specific details.
После того, как вы напечатали что-то на терминале, вы не сможете легко это удалить. Вы можете очистить экран, но как именно это сделать, зависит от типа терминала, а очистка экрана приведет к удалению всего текста с экрана, а не только того, что вы напечатали.
Если вам действительно нужен точный контроль над выводом на экран, используйте библиотека наподобие ncurses .
Что касается C, stdout - это не что иное, как поток байтов. Этот поток может быть подключен к ЭЛТ (или плоскому экрану), или он может быть подключен к устройству для копирования, например телетайпу или даже к полистному принтеру. Вызов перемотки в потоке не обязательно отразится на устройстве вывода, потому что это может не иметь никакого смысла в контексте этого устройства; подумайте о том, что будет означать перемотка на печатном терминале или листовом принтере.
C не предлагает встроенной поддержки для управления отображением, поэтому вам придется использовать стороннюю библиотеку, например ncurses.
Фактически, когда вы захватываете / перенаправляете свой stdout (./program> output.file), нет способа удалить содержимое этого файла, даже printf ("\ 033 [2J \ 033 [1; 1H "); просто добавляет в него эту последовательность символов.