• ベストアンサー

fopenの使い方

Cのfopenを使用する際、開くファイル名をプログラム中に書くのでなく、プログラム実行時にキーボードで打ち込んだ文字をファイル名とするプログラムの書き方を教えてください。 出来れば参考にしたいため、簡単なもので良いのでプログラムも書いていただけると、うれしいです。 よろしくお願いいたします。

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

  • ベストアンサー
  • Interest
  • ベストアンサー率31% (207/659)
回答No.5

授業の宿題ではありませんよね? やり方は何通りかあると思いますが、コマンドプロンプト(やターミナル)から プログラム名 ファイル名 と入力してプログラムを実行する場合は、以下のようなスタイルで書くと、ソースコード中にファイル名を書かなくてもプログラム中で指定したファイルを操作できます。 ------------------------------------------------- #include <必要なヘッダファイル> int main(int argc, char **argv) { FILE *fp; /* 引数がなければ、バージョン番号、使い方を表示してプログラムを終了する。*/ if( 1 >= argc ){ バージョンを表示する(); 使い方を表示する(); } /* 引数をファイル名としてファイルを開く。 指定されたファイルが開けなければ、メッセージを表示して終了する。 */ fp = fopen( argv[1], "r"); if( NULL == fp ){ ファイルが開けないときのエラーメッセージを表示する(); return 0; } 以下、ファイルが開けたときの正常系の処理を進める。 fclose( fp ); /* 後始末を忘れずに。 */ return 0; } ------------------------------------------------- プログラムを実行中にファイル名を読み込むのであれば、char filename[N] を用意してここにファイル名をscanfで取り込み、fp = fopne( filename, "r" ); とすればいいですね。

その他の回答 (4)

  • bonyamk
  • ベストアンサー率29% (49/166)
回答No.4

{ char fname[256]; FILE *fp; printf("input filename:"); scanf("%s",fname); if((fp = fopen(fname,"r") == FALSE) { printf("cann't open.\n"); } //ここに処理 fclose(FH); } scanfって・・・物凄い久しぶりに使ったな^^;

  • ggaogg
  • ベストアンサー率43% (38/88)
回答No.3

//fopentest.c #include <stdio.h> int main(int argc, char *argv[]){ FILE *pFile; //end if no parameter// pFile = fopen(argv[1], "w"); if(pFile==NULL) return -1; fprintf(pFile, "作成されたファイルへ書き書き"); fclose(pFile); return 0; } あとはプロンプトで fopentest [作成したいファイル名] でぉーけぃ!

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.2

起動時引数を使って、fopen()するのが、一番手っ取り早いかと。

参考URL:
http://nguyen.univ-tln.fr/Enseignement/C/cat.c
  • cats1234
  • ベストアンサー率28% (103/356)
回答No.1

char fname[256]; printf("ファイル名を入力してください\n"); gets(fname); こんな感じでファイル名を入力すればできると思います。 当然入力したファイル名チェック等は必要ですよ。

関連するQ&A

  • fopen()関数

    こんにちは。 PHPで、fopen()関数を使用し、別ファイルにでーたを保存しているのですが、 fopen ("ファイル名", "a"); とやると、ファイルに追記されますよね。 この追記を、ファイルの一番最初に行いたいのです。 一番最初に書き込みをできるということで、 fopen ("ファイル名", "r+"); なども試してみたのですが、 その追記された文字数だけ最初側の文字が消えてしまい、追記は無理でした。 rewind()関数も使用したのですが、ダメでした。 何方か、ファイルの最初に、既に書き込まれている文字を消さずに追記する方法をご教授くだされば幸いです。

    • ベストアンサー
    • PHP
  • C言語のfopenについて教えてください。

    C言語のfopenについて教えてください。 ある1つのファイルをr(テキストファイル読み込みモード)でfopenしたとします。 そのファイルをfcloseする前に、同じファイルが再度rモードでfopenされても問題ないのでしょうか? 何を気にしているかと言いますと、あるプログラムであるファイルをrモードでfopenして読み込む処理があるのですが、そのプログラムを呼び出す処理が複数あります。 確率は低いと言えど、もし同時にその処理が実行された場合、rモードでfopenしているファイルにfclose前に再度rモードのfopenがされたらエラーとなってしまうのでしょうか? もし、エラーとなる場合、回避する方法がありますか? また、エラーとならない場合は、fcloseするまで次の処理が待ってしまうのでしょうか? 読み込みモードだから問題ないのかなとも思ったのですが、どなたかご存知だったら教えてください。 よろしくお願いしますm(_ _)m

  • USWC fopenできません。

    USWCの勉強を始めて3日目の初心者です。 fopenの使い方がわからず困っています。  file = fopen("C:\test.txt",F_READ)  msgbox(file) 実行するとfileの戻り値は"1"なのにファイルが何も開きません。 何がおかしいのでしょうか? 初歩的な質問で申し訳ありませんがご教授ください。

  • c言語のfopen()がうまくいきません…。

    c言語のfopen()がうまくいきません…。 現在、XP環境でC言語(Turbo c)を使ってあるツールを作成しています。 パスも指定して13文字以上のファイル([13以上の文字列].txt)を読み込む必要があるのですが、 ロングファイルネームが認識できないのか、ファイルオープンに失敗してしまいます。 ショートファイルネームの取得法もわかるのですが、プログラムへの組み込み方がわかりません。 そこで、 1.ファイル名(ロングファイルネーム)を指定するとショートファイルネームが取得(あるいは変換)できる 2.ロングファイルネームのままでもオープンできる ↑↑のような何かいい方法はありますでしょうか?? 力技でもいいですが、他人も使用するツールなのでなるべくどのPCでも作動するような対応策の伝授をお願いします。 ちなみに、ツールの起動はDOSプロンプトからとなっています。 質問するのは初めてなのでどう書いたらいいのかわかりませんが、よろしくお願いします。

  • fopenが動作しない

    PHPで、別のファイルで取得したファイル名をもとに fopenを使ってファイルを開こうとしているのですが、 どうしてもうまくいきません。 具体的な症状は以下のとおりです。 a.phpの中で、 … $file[2] = "hoge02.xml"; … のように、配列にファイル名を代入します。 これを b.php で require_once('a.php'); とした後 print_r($file); とすると Array([0] => … [2] => "hoge02.xml" [3]…) のように表示されるところまでは確認できました。 しかし、 $file0 = $file[2]; $fp = fopen("$file0", 'r'); とすると Warning: fopen( "hoge02.xml" ) [function.fopen]: failed to open stream: Invalid argument in [b.php の絶対アドレス] とエラーが出てしまい、実行することが出来ません。 そこで、 //$file0 = $file[2]; $file0 = "hoge02.xml"; $fp = fopen("$file0",'r'); とすると実行することが出来ました。 作成しているシステム上、fopenの1つ目の引数には変数または配列を使いたいのですが、 エラーが発生してどうしてもうまくいきません。 自分なりにも似たようなエラーがないか調べたのですが、 それらしいものを見つけることが出来ず、お手上げ状態です。 どなたか解決策をご存じないでしょうか。 ご教授の程、よろしくお願い致します。

    • 締切済み
    • PHP
  • fopen(ファイルパス)

    いつもお世話になっております。 現在ファイルの作成、入力について勉強しています。 FILE *maketxt; maketxt = fopen("C:\~\~\~.txt",w+); 上の状況でファイルの作成は出来るようになりましたが、 更にファイル名をfopen関数の外に定義したいと思っています。 というのもファイル名にタイムスタンプを入れたいためで、ためしに以下のようにやってみてもできませんでした。(タイムスタンプに関しては事前にlocaltime関数で定義済み) fprintf(text,C:\~\~\%d.txt,tm_sec); maketxt = fopen("text",w+); うまい書き方をご存知の方、ご教授お願いいたします。

  • fopenでのパス指定

    毎度お世話になります。 ただ今VS2005でWindowsアプリケーションの実装を行っています。 fopenでパス指定をしてファイルを開くとき、  fopen("C:\\Test\\data.txt", w); としますが、GetModuleFileNameで取得したパス↓  GetModuleFileName(NULL, szPath, sizeof(szPath)); を使用したいとき、単に  fopen(szPath, w); ではできません。これはszPathの中身が  C:\Test\data.txt となっているためにfopenでは開けないんだと思うのですが、 わざわざszPathの文字を1文字づつ見ていって、 "\"があったときに"\"を付け足す… という作業をしなければならないのでしょうか。 他に解決策があるのでしょうか。 ご教授お願いします。

  • fopen()とFileOpen() どの様に違いますか?

    Borland C++Builder5でテキストファイルを読み書きするようなプログラムを作っています。 テキストファイルを読み書きするのに、fopen()、fgets()というような関数を使っています。 しかし、FileOpen()関数などもあり、どちらを使うべきか分かっていません。 結果が同じならどちらでも良いのですが、Windows7が出たり、将来64ビットOSが主流になった時などに、今私が作ったプログラムが動かない、というようなことが起きると困ります。 私にプログラム言語を教えてくれた人が、ちょっと古い人で、昔の知識を引きずっているようなのです。 現状は何も問題は起きていないのですが、ちょっと心配なのです。

  • fopenで強制終了

    C++でGUIプログラムを作成しています。 char FN[200]; FILE *fp; ダイアログボックスで色々な値を入力 ↓ ファイル保存ダイアログでファイルを選択(FNに代入) ↓ MessageBox(NULL,FN,"",NULL); fp=fopen(FN,"w"); MessageBox(NULL,"","",NULL); fclose(fp); MessageBox(NULL,"","",NULL); のようにすると、1回目のダイアログボックスにファイル名が出たあと、強制終了してしまいます。 値を入力するダイアログボックスに文字列を入力していると強制終了し、文字列でなく数字を入力、または空欄にしておくと強制終了しないようです。 変数がかぶっているかもしれないと思いfpとFNでGREPしましたが、怪しいと思われるところはありませんでした。 場所的にfopenでエラーになっていると思うのですが、原因は何でしょうか。

  • fopen関数について

    ----------------------------------------- #include<stdio.h> #include<stdlib.h> int main() { FILE *fp; char filename[80],ss[256]; printf("ファイル名="); gets(filename); if((fp=fopen(filename,"r"))==NULL){ printf("ファイルをオープンできません.\n"); exit(1); } while(fgets(ss,256,fp)!=NULL){ printf("%s",ss); } puts(""); fclose(fp); return 0; } ----------------------------------------- 初心者な内容の質問ですいません。 以上のプログラムでまず、「gets(filename);」により、「filename[80]」の配列に「aaa.txt」という文字列を格納し、そのファイルをfopenで読もう込もうとしています。 そこで、 if((fp=fopen(filename,"r"))==NULL) の部分に疑問があるのですが、「filename」という配列名だけで中身の「aaa.txt」と何故認識できるのでしょうか? 配列名ということで、先頭アドレスのみの情報しかないと思いました。 教えていただければ嬉しいです。