• ベストアンサー

FILE*のfopenの素朴な疑問

fopenの定義をいかに記します。 FILE *fopen(const char *filename, const char *mode); filenameはconstで定義されることを要求されております。 が以下の内容はコンパイルできます。 int main(int argc, char** argv) { FILE* ftemp; ftemp = fopen( argv[1], "r" ); } この場合、argvはconstではありません。 constの必要性ってありますか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.5

>ちなみに"TEST.TXT"がリテラルってことでしょうか? そうとも言い切れませんが、一般的には「そう」ですね。 ちょっと乱暴で不正確ですが、簡単に言えば「ROM領域や、リードオンリーでライトプロテクトされたメモリ領域など、書き込みできないメモリに配置された文字列も指定可能」って事です。

NEW2010
質問者

お礼

わっかりました~! 理解が深まりました!

すると、全ての回答が全文表示されます。

その他の回答 (4)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

それはちょっと乱暴すぎませんかね>#3. 任意の型 T に対し T * は const T * に自動変換可能だが逆は自動変換できない. 結果として, 仮引数の const char * に対応する実引数は char * でも const char * でも構わないのに対し, 仮引数が char * であるなら対応する実引数は char * でなければならない (const char * は不可). さて, char buf[256]; char *p = buf; const char *cp = buf; strcpy(buf, "abc"); strcpy(p, "abc"); strcpy(cp, "abc"); とやったときにどれが OK でどれが NG でしょうか?

NEW2010
質問者

お礼

char *strcat(char *s1, const char *s2); ですので、 strcpy(buf, "abc"); OK strcpy(p, "abc");  OK strcpy(cp, "abc");  NG ですね!仮引数の const char * に対応する実引数は char * でも const char * でも構わないのですか! ありがとうございます!理解が深まりました!

すると、全ての回答が全文表示されます。
  • asuncion
  • ベストアンサー率33% (2127/6290)
回答No.3

コンパイルが通って、かつ、 思ったとおりに実行できれば、 それでよし。 何かのコードを書いたら、 まずは自分で実験してみましょう。

NEW2010
質問者

お礼

ありがとうございます! 御意にございます。

すると、全ての回答が全文表示されます。
回答No.2

FILE *fopen(const char *filename, const char *mode); これの意味は「fopenは、fopen関数の中で、filenameやmodeが指す文字列を書き換えませんよ」って意味です。 つまり fp = fopen("TEST.TXT","wt"); などのような「リテラルな値」を指定可能である、と言う事を意味します。 一方 char *strcat(char *s1, const char *s2); は「s1が指す文字列はstrcatの関数内で書き換える可能性があるぞ。だけどs2が指す文字列はstrcatの関数内で書き換えないぞ」って事を意味します。 つまり char buf[256]; buf[0]='\0'; strcat(buf,"abc"); は可能だけど const char *ptr = ""; strcat(ptr,"abc"); はやっちゃ駄目、って事を意味しています。

NEW2010
質問者

お礼

fp = fopen("TEST.TXT","wt"); などのような「リテラルな値」を指定可能である、と言う事を意味します なるほど!リテラルな値が使えることを意味しているのですね!ちなみに"TEST.TXT"がリテラルってことでしょうか? あほですいません。

すると、全ての回答が全文表示されます。
  • asuncion
  • ベストアンサー率33% (2127/6290)
回答No.1

constにしておけば、 不用意に書き換えようとすると 何かまずいことが起きるかも、 というくらいのものです。 当該のコードでは、argvにconstを付ける必要性はありません。 なお、argv[1]にアクセスする際は、 argcが2以上であることが必要です。 そのコードでは、実行時に何も引数を与えないままだと、 いきなり落ちてしまうことでしょう。

NEW2010
質問者

お礼

早速のご返信ありがとうございます。 それでは以下の場合どうですか。 FILE* ai; char buff[16]; CString A; A=_T("D:\\1.txt"); strcpy( buff, CStringA(A) ); ai=fopen(buff,"r"); A=_T("D:\\2.txt"); strcpy( buff, CStringA(A) ); ai=fopen(buff,"r"); buffは書き換わりますが、コンパイル通りますね。 それともこれは不用意な書き換わりではないので コンパイルが通るのでしょうか?

すると、全ての回答が全文表示されます。

関連するQ&A