簡體   English   中英

c中stdout的緩沖行為

[英]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() ),你很可能會看到一個空文件。 無論您是使用getcharsleep還是一段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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM