プログラム中と、コマンドラインのリダイレクトで同じファイルに書くという意味不明のことをしていますが、
動作としては、
(1) リダイレクトにより標準出力として3.txt
をオープンする
(2) プログラム内で標準出力に"a"
を出力する
(3) プログラム内で3.txt
をオープンする
(4) プログラム内で"e"
を出力する
(5) プログラム内で3.txt
をクローズする(この時点で"e"
がファイルに書かれる)
(6) リダイレクトした標準出力をクローズする(この時点で"a"
がファイルに書かれる)
ということになるので、(5)を(6)が上書きします。つまり、3.txt
には"a"
が残る。
と、Linuxならそうなるのですが、WindowsのコマンドプロンプトやPowerShellで実行すると、プログラムが異常終了します。エラーメッセージは特に出ませんが。
調べると、q = fopen("3.txt","w");
がエラー(q
がNULL
)で、Permission denied
ですね。
ということで、少なくともファイルオープンはエラーチェックをしましょう。
C
1#include <stdio.h>
2
3int main(void)
4{
5 FILE *p, *q;
6 int ret;
7
8 p = fopen("1.txt","w");
9 if(!p) { perror("open 1.txt"); return 1; }
10 q = fopen("2.txt","w");
11 if(!q) { perror("open 2.txt"); return 1; }
12
13 printf("a\n");
14 fprintf(p,"b\n");
15 fprintf(q,"c\n");
16 ret = fclose(q);
17 if(ret) { perror("close 2.txt"); return 1; }
18 q = fopen("3.txt","w");
19 if(!q) { perror("open 3.txt"); return 1; }
20
21 fprintf(p,"d\n");
22 fprintf(q,"e\n");
23
24 ret = fclose(p);
25 if(ret) { perror("close 1.txt"); return 1; }
26 ret = fclose(q);
27 if(ret) { perror("close 3.txt"); return 1; }
28 return 0;
29}
厳密に言うと、printf
やfprintf
もエラーチェックすべきですが、普通はそこまでしません。