[英]buffering behaviour of stdout in c
當我運行第一個代碼並立即按下ctrl-c時,將沒有45
寫入文件。 但是當我運行第二個代碼時,我確實得到45
。
我無法理解為什么在下面的代碼中發生這種行為? 如果stdout
是行緩沖的話,輸入字符后輸出不應該輸出嗎? 我錯過了什么?
第一個代碼:
#include<stdio.h>
#include<stdlib.h>
int main()
{
FILE *fp=stdout;
fp=fopen("myfile","w");
fprintf(fp,"%d",45);
getchar();
// return 0;
}
第二個代碼:
#include<stdio.h>
#include<stdlib.h>
int main()
{
FILE *fp=stdout;
fprintf(fp,"%d",45);
getchar();
// return 0;
}
PS:我正在使用GCC,平台是Linux。
我不認為getchar
與您在第一個代碼中觀察到的緩沖有任何關系。 如果你不按任何字符並等待一段時間(即保持在getchar()
),你很可能會看到一個空文件。 無論您是使用getchar
, sleep
還是一段while(1)
停止程序,都會發生這種情況。
現在按Ctrl-C
,程序沒有注冊處理程序,因此程序突然終止。 是否在突然的程序終止時刷新緩沖區/流是實現定義的 。 閱讀完整的故事
例如,在我的系統上(Windows 7,內部使用gcc和mingw框架的代碼塊),我可以看到45
確實被刷新到文件中,無論使用getchar
還是其他任何東西突然終止它。 即在我的系統上,實現是在突然程序終止時將數據刷新到文件。
因此,最重要的是,當您以非正常方式執行操作時會發生什么實現定義!
但第二種情況確實是一個好奇的例子,其中getchar
似乎正在刷新stdout
緩沖區。 一旦我找到為什么getchar
是/似乎要刷新stdout
緩沖區的確切原因,我將更新
引起混淆的是getchar() ,看起來就像它被稱為沖洗stdout一樣 。
如果用sleep(10)
類的東西替換getchar()
,則不會打印出45。
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
int main()
{
FILE *fp=stdout;
//fp=fopen("myfile","w");
fprintf(fp,"%d",45);
sleep(10);
//getchar();
// return 0;
}
您要寫入物理文件的第一種情況。 fopen,fclose是緩沖I / O取決於實現,數據可能不會立即提交,直到緩沖區已滿。 調用fclose()將導致緩沖區寫入磁盤。
您正在寫入STDIO的第二種情況和寫入STDIO的數據通常會立即顯示。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.