-1

次のコードを実行すると

#include<stdio.h>
#include<unistd.h>

int main(void)
{
    int i; 
    for(i=0;i<=100;i++)
    {
        printf("Percentage complete: %d %%",i);
        sleep(1);
    }
    printf("\n");
}

ただし、次のコードを実行すると、コードは機能しません。

#include<stdio.h>
#include<unistd.h>

int main(void)
{
    int i; 
    for(i=0;i<=100;i++)
    {
        printf("\nPercentage complete: %d %%",i); //There is a newline here
        sleep(1);
    }
    printf("\n");
}

コードは機能しているようです。理由はわかりません。

4

3 に答える 3

10

「機能しない」と言うとき、毎秒新しい出力行が表示されないことを意味していると思います。

これは、端末が行バッファリングされていることが多いためです。つまり、完全な行を受信するまで、受信テキストを表示する作業を実行しません。

出力ストリームを「フラッシュ」して、端末に強制的に表示させることで、これを回避できます。

fflush(stdout);

また、コードreturnの末尾にステートメントがありませんmain()

于 2013-01-14T15:09:14.550 に答える
4

printf()テキストはstdoutバッファに送信されます。このバッファは、改行で自動的にフラッシュされます。したがって、改行を出力しない場合、バッファは自動的にフラッシュされません。

バッファを手動でフラッシュするにはfflush(stdout)、次のように使用します。

for(i=0;i<=100;i++)
{
  printf("Percentage complete: %d %%",i);
  fflush(stdout);
  sleep(1);
}

同じ行を何度も更新したい (パーセンテージが増加する一種のアニメーションを持っている) と仮定すると\r、印刷されたテキストの前に置きたいと思うかもしれません:

printf("\rPercentage complete: %d %%",i);
于 2013-01-14T15:09:55.477 に答える
3

printfバッファリングされた出力です。バッファーがいっぱいになるか、改行が検出されるまで、データはコンソールに出力されません。

fflushを呼び出すことで、データを強制的に印刷できますstdout

于 2013-01-14T15:09:57.097 に答える