sprintf(datafile,"sample.txt");
fp=fopen(datafile,"a");
fprintf(fp,"%d\n",sample);
由於緩存的原因,內容未寫入文件。
1.在fopen之后,加句:setbuf(fp,NULL);
2.fprintf后面加上fflush(fp);
################################
長時間運行可能存在程序崩潰
##################################
setbuf
程序輸出有兩種方式:一種是即時處理方式,另一種是先暫存起來,然后再大塊寫入的方式,前者往往造成較高的系統負擔。因此,c語言實現通常都允許程序員進行實際的寫操作之前控制產生的輸出數據量。
這種控制能力一般是通過庫函數setbuf實現的。如果buf是一個大小適當的字符數組,那么:
setbuf(stdout,buf);
語句將通知輸入/輸出庫,所有寫入到stdout的輸出都應該使用buf作為輸出緩沖區,直到buf緩沖區被填滿或者程序員直接調用fflush(注:對於由寫操作打開的文件,調用fflush將導致輸出緩沖區的內容被實際地寫入該文件),buf緩沖區中的內容才實際寫入到stdout中。緩沖區的大小由系統頭文件< stdio.h >中的BUFSIZ定義。
函數聲明
void setbuf(FILE *stream, char *buffer)
參數
- stream–這是指向FILE對象的指針,該FILE對象標識了一個打開的流
- buffer–這是分配給用戶的緩沖,他的長度至少為BUFSIZ字節,BUFSIZ是一個宏常量,表示數組的長度.
返回值
該函數不返回任何值
實例
#include<stdio.h>
int main()
{
char buf[BUFSIZ];
setbuf(stdout, buf);
puts("This is my test");
fflush(stdout);
return 0;
}
程序在即將輸出的時候,發送輸出到STDOUT,否則將它緩沖輸出
fflush
描述
c庫函數 int fflush(FILE *stream)刷新流stream的輸出緩沖區
聲明
下面是fflush()函數的聲明
int fflush(FILE *stream)
參數
- stream—這是指向FILE對象的指針,該FILE對象指定了一個緩沖流
返回值
如果成功,該函數返回零值.如果發生錯誤,則返回EOF,且設置錯誤標識符
實例
#include<stdio.h>
#include<string.h>
#include<unistd.h>
int main()
{
char buff[1024];
memset(buff, '\0', sizeof( buff ));
fprintf(stdout,"啟用全緩沖\n");
setvbuf(stdout,buff,_IOFBF, 1024);
fprintf(stdout,"這里是 okokme\n");
fprintf(stdout,"該輸出將保存到 buff\n");
fflush(stdout);
fprintf(stdout,"這將在編程時出現\n");
fprintf(stdout,"最后休眠5秒中\n");
sleep(5);
return 0;
}
編譯運行后,將產生以下結果
5秒后會出現
在這里,程序把緩沖輸出保存到buff,直到首次調用fflush()為止,
然后開始流緩沖,最后休眠5秒鍾.他會在程序結束之前,發送剩余的輸出到STDOUT
fflush用來強制刷新緩沖區數據,如果需要在每次i/o操作前后,不希望緩沖中存在歷史數據或者不期望的數據或者為了清除緩存等等 的時候使用.
------------------------------------------
setbuf與fflush為什么有時候要一起使用呢
為了將你想寫的語句完整寫入緩沖區,再一並輸出或寫入文件,既保證了數據的完整又沒有亂七八糟緩沖區殘留.
tips:寫完文件之后最好調用fflush,否則有可能
fclose之后文件的最后有一部分沒有寫入完整.
