[英]c-program output
#include<stdio.h>
int main()
{
FILE *fp,*fs;
fs=fopen("c.dat","w");
fp=fopen("c.dat","w");
putc('a',fp);
putc('1',fs);
close(fs);
close(fp);
return 0;
}
與訂單執行無關
putc('a',fp);putc('1',fs);
putc('1',fs);putc('a',fp);
c.dat的內容僅為“ 1”。 有人可以解釋原因嗎?
一開始,你不要close()
你有打開的文件fopen()
,你必須fclose()
它。 您在這里混合了兩個抽象級別,即文件句柄和文件指針。
最重要的是,我認為您會發現兩個文件指針保持着獨立的文件偏移量和緩沖區。 最后一個關閉文件的文件將最后寫入其數據,而另一個覆蓋文件。
更改fclose()
語句的順序,您應該明白我的意思:
#include<stdio.h>
int main (void) {
FILE *fp,*fs;
fs=fopen("c.dat","w");
fp=fopen("c.dat","w");
fputc('a',fp);
fputc('1',fs);
fclose(fp); // Try changing these
fclose(fs); // two around.
return 0;
}
我這樣做了,並且始終根據關閉的最后一個文件獲取內容。
而且,你說在這之前你應該得到a
,因為fp
是最后一個你關閉,你沒關fp
(與fclose()
你所做的事是設法close()
這是幾乎可以肯定是無效的文件句柄,因為文件句柄一般都是比較小的值(例如, 0
, 1
, 2
),而文件指針一般都是比較大的值(例如, 0xdeadbeef
, 0xcaf3f00d
)。
因此,當您退出時,這兩個文件的關閉將留給C運行時環境進行(這很可能以確定性的方式完成,這就是為什么您在文件中始終獲得相同的值)。
您正在打開相同的文件進行兩次寫入。 那時所有賭注都沒有了。
您沒有指定操作系統,但是在win和* nix系統上,進程之間共享文件緩沖區,因此:
putc('a',fp);
putc('1',fs);
如果您顛倒putc語句的順序,則會在同一緩沖區中寫入完全相同的地址,最后在文件中將以'a'結尾。 *
只是說明這一切有多么棘手。 我已經嘗試過了,影響輸出的是文件打開的順序-第一次打開總是優先的。
我認為這是因為您首先通過fs = fopen打開了c.dat,然后某些鎖不允許寫入“ a”,因為這將要求再次打開文件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.