質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

3回答

1032閲覧

リダイレクションについて

KYUURI

総合スコア46

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2020/07/06 03:11

リダイレクションについて

mkdir test.c ⇨ cd test.c ⇨ emacs prg.c

#include <stdio.h>

int main(void)
{
FILE *p, *q;
p = fopen("1.txt","w");
q = fopen("2.txt","w");

printf("a\n"); fprintf(p,"b\n"); fprintf(q,"c\n"); fclose(q); q = fopen("3.txt","w"); fprintf(p,"d\n"); fprintf(q,"e\n");

fclose(p);
fclose(q);
return 0;
}

にして gcc -Wall -o prg.exe prg.c -lm でコンパイルして ./prg.exe > 3.txt を実行すると、e と出力するはずなのですが、何も実行されませんでした。どこが違うのでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2020/07/06 03:15

./prg.exe と実行するとなにが表示されますか?
KYUURI

2020/07/06 03:16

a と表示されます
y_waiwai

2020/07/06 03:17

では、3.txt の内容はどうなってるでしょう
KYUURI

2020/07/06 03:18

a でしょうか
KYUURI

2020/07/06 03:20

保存されているのは e だが、実行されるのは a ということでしょうか
y_waiwai

2020/07/06 03:24

ちゃんと内容を確認しようよw 実際にはその内容はどうなってるんでしょうか
otn

2020/07/06 03:35

> 何も実行されませんでした。 実行はしたのでは?
guest

回答3

0

プログラム中と、コマンドラインのリダイレクトで同じファイルに書くという意味不明のことをしていますが、
動作としては、
(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");がエラー(qNULL)で、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}

厳密に言うと、printffprintfもエラーチェックすべきですが、普通はそこまでしません。

投稿2020/07/06 04:15

otn

総合スコア84786

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

なにを聞きたいのかいまいちはっきりしませんが、
Windowsのリダイレクトでは、

  • ./prg.exe を実行
  • リダイレクトにより標準出力を3.txtに保存

という順番に実行されます。

投稿2020/07/06 03:28

y_waiwai

総合スコア87793

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KYUURI

2020/07/06 03:31

理解できました ありがとうございます
guest

0

標準出力をリダイレクトしたのだから、何も表示されないのは意図した挙動では?

c

1printf("a\n");

3.txtに書き込まれたはずです。

投稿2020/07/06 03:15

yumetodo

総合スコア5850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問