• ベストアンサー

c言語 fopen

fopenについて質問があります。 fopenでファイルを開くとき、  fopen("http://~~~.php?A=1","r")  のようにURLを指定できるのでしょうか。

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

  • ベストアンサー
  • rentahero
  • ベストアンサー率53% (182/342)
回答No.6

fopenはファイルをストリームとしてオープンする関数なので、できません。 どうしても、ということであれば、以下のようにすれば可能です。 BSDやLinuxをはじめとする環境で、いわゆる"the unix berkley socket library"をつかえるなら、socket(2)でSOCK_STREAMを指定して得られたディスクリプタをconnect(2)成功後にfdopen(3)に渡してやれば、ストリームとして処理することも可能です。この手法はwindows上ではcygwinで利用可能です。残念ながらWinsockではソケットハンドルはファイルディスクリプタと等価ではないので、この手法は使えません。 ただし、この場合はTCP上での通信がすべてこのストリーム上に乗るので、HTTPであれば GET /hogehoge.php?A=1 HTTP/1.1 Host: www.example.com (以下略) などと送信しなければなりませんし、 HTTP/1.1 200 OK Date: ~~~~~ (以下略) などと全部のHTTP応答の処理もする必要があります。 多分、あなたが思っているものとは違ったのではないでしょうか。

peanuts4317
質問者

お礼

不明確な質問にも関わらず、お答え頂きありがとうございます。UNIXを使っています。 C言語のみで実装するのは、ちょっと難しそうですね。。実は、もっと簡単にいくのでは、と甘く見ていました。。せっかく方法を教えていただいたのに本当に申し訳ないですが、知識不足でわからない点もあるので、調べて見ようと思います。

その他の回答 (5)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.5

> プログラム上でURLをオープンして、 > そこに書いてある文字が0か1かによって、 > 処理を制御したかったのですが、不可能なのでしょうか。。。。 ハードウェアや運用環境まで含めて、何を使ってもよいのであれば、可能か不可能化でいえば可能です。「C言語」だけで実現するのであれば、一般的には不可能です。 つまり、ここから先のことが知りたければ、最低限どんな処理系を使っているかぐらいは書きましょう。 例えば、インターネットに接続できないような環境であれば、どんなに頑張っても不可能です。マイコン用の処理系のように、fopen等ストリームライブラリの低水準関数をユーザーが定義するようになっている処理系であれば、LANコントローラがあるなら、プロトコルスタックを自作するなりして、fopenやfgetc等で使えるようにすることも可能といえば可能です。

  • MrBan
  • ベストアンサー率53% (331/615)
回答No.4

#3です。 fopenでは、不可能と考えても支障はないと思います。 別の手段が必要です。 環境依存なので環境が分からないと使えるかも分かりませんが、例えば Windows であれば、Internet API (InternetOpenUrl 等)が比較的簡単に URL の先を開ける手段かと思います。 # もちろん、Windows 以外の OS 上では別の手段が必要です。 # http のプロトコルに従い Socket で処理を書く手段もあります。

  • MrBan
  • ベストアンサー率53% (331/615)
回答No.3

単に文字列なので指定はできると思いますが、おそらくお望みの動作をせずに、オープン失敗のエラーが返るものと思われます。 fopen について規格書(ISO/IEC9899:1999)では、以下のように規定されています。 <引用> 2 The fopen function opens the file whose name is the string pointed to by filename, and associates a stream with it. </引用> URL を filename として取り扱うような filesystem 上で のお話か、標準ライブラリ実装の独自拡張なら取り扱えるかもしれませんが、現行の PC 上であれば、おそらく取り扱えない実装の方が一般的と思います。 結果として、前述のようにエラーが返る可能性が最も高く、仮にオープンできたとしても、環境依存にならざるをえません。

peanuts4317
質問者

お礼

皆様、ご回答ありがとうございます。 プログラム上でURLをオープンして、 そこに書いてある文字が0か1かによって、 処理を制御したかったのですが、不可能なのでしょうか。。。。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

> fopenでファイルを開くとき、 >  fopen("http://~~~.php?A=1","r")  > のようにURLを指定できるのでしょうか。 できるかどうかは、標準ライブラリの実装に依存します。

  • PrintScree
  • ベストアンサー率25% (538/2091)
回答No.1

fopen()はstdio.hで(多分)定義されている関数なので、ネットワークアクセスは出来ません。 ネットワークポートを使用したI/Oはそれ専用の関数があるのでそちらを利用することになります。 Windowsならwinsock.hやwinsok2.h。

関連するQ&A

  • C言語のfopenについて教えてください。

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

  • C言語 fopen

    初心者の質問になります。現在ファイルがオープンできるかどうかを確認したいのですが、指定したディレクトリの中のファイルを指定しているのですが、オープンできませんという結果が返ってきます。同じ場所にファイルを置いてファイル名だけでしていするとオープンが出来ます。 何卒よろしくおねがいします。 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int main(void) { FILE *fp; char *filename = "/file/d20151001.csv"; fp = fopen(filename,"r"); if (fp == NULL) { printf("\aファイルをオープンできません\n"); } else { printf("ファイルがオープンできました\n"); fclose(fp); } return (0); } ディレクトリ(わかりにくくてすいません汗) file------d20151001.csv data.c 環境 VisualStudio

  • fopen【C言語】

    C言語でファイルをオープンするときに デスクトップにあるkanjdata.txtというファイルを指定したいのですが \ や : 等色々試してみたのですがどうしてもファイルが開けません、どの様に指定すればデスクトップにあるファイルをオープンできるのでしょうか?? kanjdata.txtのある場所は C:\Documents and Settings\ユーザ\デスクトップ です、よろしくお願いいたします. 今作っているもの if( (fp = fopen("kanjdata.txt","rt") ) ==NULL ) { printf("ファイルが開けません\n") ; exit(0) ; }

  • 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
  • [c言語] fopenでの追記

    c言語についてです。 すでにあるテキストファイルに追記したい場合、ファイルの一番下の行から追記されてしまうのですが、 最初から追記ができるようにするにはどうすればいいのですか。 ※ FILE *fin=fopen=("hoge.log","a"); や FILE *fin=fopen=("hoge.log","a+"); で開いてます。 ( rewind(fin)は無理でした。 ) よろしくお願い致します。

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

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

  • fopenがURL指定で開けない

    別サーバーにあるwmvファイルをDLさせようとしているのですが、以下のWarningが出てURL指定でfopenで開けません。 Warning: php_network_getaddresses: getaddrinfo failed: name or service is not known in [URL] php.iniで、allow_url_fopen はONになっており、ファイルを同サーバー内に置いてパス指定した場合は成功するのですが。。。 3日かけて調べましたが全く手詰まりです。。 何か他に考えられる原因はありますでしょうか? すみませんがどなたか感所のある方、宜しくお願いします。<(_ _)> 環境: RedHat Linux Apache1.3.3 PHP4.3.x

    • 締切済み
    • PHP
  • fopen()関数

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

    • ベストアンサー
    • PHP
  • fopenしてくれない。。。

    こんにちは。PHP初級者です。 postgresqlに入れたデータをCSVファイルに書き込んで、出力してみたいと思って以下のプログラムを作ってみました。 $file_name ="insatu.csv"; //データベースから呼び出し以下の$arrayへいれるデータは省略します。 //今回は1行のみのデータを入力プログラムになってますが、本当は何行もやるプログラムとなってます。 $array = compact("a","b","c","d","e","f","g","h","i","j","k","l"); $string = implode("," , $array); $file = fopen($file_name, "a") or die ("openエラー $file_name"); flock($file, LOCK_EX); fputs($file, $string."\n"); flock($file, LOCK_UN); fclose($file); $file = fopen($file_name, "r"); while($array = fgetcsv($file, 1000, ",")){ echo "<hr> \n"; for($i=0; $i< count($array); $i++){ echo $array[$i]."<br>"; } } fclose($file); なぜか最初の fopenで dieの方へ行って OPENエラーメッセージが出てきます。 この作業をするためには何かあらかじめ入れなくてはいけない構文とかあるんでしょうか?何か間違っていますでしょうか? それともphp.iniを設定するとかしなくてはいけないんでしょうか? php5を使用してますが、php.iniやphp.ini-distはともに見つからず。 困り果ててます。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • fopenのmode「w」について

    宜しくお願い致します。 fopenのmode「w」で、ファイルを新規作成しつつ、データを書込みたい場合で、サーバ間でファイルを作成したい場合、http://~では、mode「w」でのファイル作成は出来ないですが、ftp://でのファイル作成は出来るとマニュアルに書いてあるのですが、failed to open streamエラーが発生してファイルが作れません。 PHP.iniで、open_basedirの指定はされておらず、allow_url_fopenはOnになっているのですが・・・。 何卒、ご教授の程、宜しくお願い致します。

    • 締切済み
    • PHP

専門家に質問してみよう