簡體   English   中英

C程序輸出

[英]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()這是幾乎可以肯定是無效的文件句柄,因為文件句柄一般都是比較小的值(例如, 012 ),而文件指針一般都是比較大的值(例如, 0xdeadbeef0xcaf3f00d )。

因此,當您退出時,這兩個文件的關閉將留給C運行時環境進行(這很可能以確定性的方式完成,這就是為什么您在文件中始終獲得相同的值)。

您正在打開相同的文件進行兩次寫入。 那時所有賭注都沒有了。

您沒有指定操作系統,但是在win和* nix系統上,進程之間共享文件緩沖區,因此:

    putc('a',fp); 
    putc('1',fs);

如果您顛倒putc語句的順序,則會在同一緩沖區中寫入完全相同的地址,最后在文件中將以'a'結尾。 *

只是說明這一切有多么棘手。 我已經嘗試過了,影響輸出的是文件打開的順序-第一次打開總是優先的。

我認為這是因為您首先通過fs = fopen打開了c.dat,然后某些鎖不允許寫入“ a”,因為這將要求再次打開文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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