c程序输出

时间:2010-11-04 04:27:20

标签: c

#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”。 有人可以解释一下原因吗?

4 个答案:

答案 0 :(得分:2)

首先,您没有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()几乎肯定无效的文件句柄,因为文件句柄通常是相对较小的值(例如{ {1}},01)而文件指针通常是相对较大的值(例如20xdeadbeef)。

因此,当您退出时,这两个文件的关闭都会留给C运行时环境(这很可能是以确定的方式完成的,这就是为什么你总是在文件中得到相同的值)。 / p>

答案 1 :(得分:1)

您正在打开相同的文件以进行两次写入。所有赌注都在那时下注。

答案 2 :(得分:1)

您没有指定无法运行的操作系统,但在win 和* nix系统文件缓冲区在进程之间共享,因此:

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

正在同一个缓冲区中写入完全相同的地址 如果你颠倒了putc语句的顺序,你最终会在文件中加上'a'。 *

不会

只是表明这一切是多么棘手。我试过这个,影响输出的是文件打开的顺序 - 第一次打开总是优先。

答案 3 :(得分:0)

我认为这是因为你首先通过fs = fopen打开c.dat然后一些锁不允许写'a',因为它需要再次打开文件。