#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”。 有人可以解释一下原因吗?
答案 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}},0
,1
)而文件指针通常是相对较大的值(例如2
,0xdeadbeef
)。
因此,当您退出时,这两个文件的关闭都会留给C运行时环境(这很可能是以确定的方式完成的,这就是为什么你总是在文件中得到相同的值)。 / p>
答案 1 :(得分:1)
您正在打开相同的文件以进行两次写入。所有赌注都在那时下注。
答案 2 :(得分:1)
您没有指定无法运行的操作系统,但在win 和* nix系统文件缓冲区在进程之间共享,因此:
putc('a',fp);
putc('1',fs);
正在同一个缓冲区中写入完全相同的地址 如果你颠倒了putc语句的顺序,你最终会在文件中加上'a'。 *
只是表明这一切是多么棘手。我试过这个,影响输出的是文件打开的顺序 - 第一次打开总是优先。
答案 3 :(得分:0)
我认为这是因为你首先通过fs = fopen打开c.dat然后一些锁不允许写'a',因为它需要再次打开文件。