C言語関係掲示板

過去ログ

No.1071 C言語でデータを自動ダウンロードしたい

[戻る] [ホームページ]
No.14056

C言語でデータを自動ダウンロードしたい
投稿者---C源吾(2004/05/16 08:33:11)


あるurlで指定されるページを自動的にダウンロードして配列に格納するなり表示するなりするプログラムを書きたいのですが、適当なサンプルはありますか?


No.14057

自己レス
投稿者---C源吾(2004/05/16 09:10:56)


検索したらこんなページが見つかりました。

http://nienie.com/~masapico/api_InternetReadFile.html

そこで疑問なんですが

1、このサンプルコードに何を加えればコンパイルできるのか?
2、表示するのではなく、配列に格納するにはどうしたらよいか?

どなたかアドバイス宜しくお願いします。


No.14060

Re:自己レス
投稿者---RAPT(2004/05/16 16:12:44)


開発環境は?

開発環境は、Windows2000sp4/VC++6.0sp6/SDK-feb2003/ATL3.0/WTL7.0 として。
σ(^^)が使っているコードを改変して掲載したけど、本来クラス化して実装していたので、このままで正しく動くかは不明。

#include <windows.h>
#include <wininet.h>
#include <winbase.h>

#pragma comment(lib, "wininet.lib")

#define FILE_BUFFER 1024

BOOL DownloadFile(LPTSTR szBuff, DWORD& r_dwLength, LPCTSTR lpszSavePath, LPCTSTR lpszUrl)
{
  HINTERNET hInternet = NULL, hFile = NULL;
  DWORD dwBytesToRead;
  BYTE data[FILE_BUFFER];

  if (lpszSavePath == NULL || lpszUrl == NULL){
    return FALSE;
  }

  hInternet = ::InternetOpen(NULL, 0, NULL, NULL, 0);
  if (hFile == NULL) {
    return FALSE;
  }

  hFile = ::InternetOpenUrl(hInternet, m_strUrl, NULL, 0, 0, 0);
  if (hFile == NULL) {
    ::InternetCloseHandle(hInternet);
    return FALSE;
  }

  r_dwLength = 0;
  do {
    ::memset(data, 0, FILE_BUFFER);
    if (!::InternetReadFile(hFile, &data, FILE_BUFFER, &dwBytesToRead)){
      break;
    }
    r_dwLength += dwBytesToRead;
    cout << data << endl;
  } while (dwBytesToRead == FILE_BUFFER);

  ::InternetCloseHandle(hFile);
  ::InternetCloseHandle(hInternet);

  return TRUE;
}



No.14065

Re:自己レス
投稿者---C源吾(2004/05/16 22:09:53)


>開発環境は?

OSはXPです。このページ
http://www.geocities.co.jp/SiliconValley-SanJose/5780/c01.html
の通りにしました。Perlでは処理速度が遅いのでCに乗り換えようと目論んでます。

ちなみに掲載いただいたコードをコンパイルしようとしたら
cmd.exe /C LCC.EXE test.c
*** コンパイル開始 ***
55.c 1: can't open: windows.h: No such file or directory
55.c 2: can't open: wininet.h: No such file or directory
55.c 3: can't open: winbase.h: No such file or directory
*** コンパイル終了 ***
となりました。(^^;;

あと参照先のurlはどう指定するのですか?

ダウンロードの部分はPerlで書いてCから呼び出すことも考えましが、
かえってややこしいでしょうか?


No.14066

Re:自己レス
投稿者---もぐりん(2004/05/16 22:49:21)


コンパイルエラーの内容は、windows.hが無いという内容です。
そして、あなたが使用しているコンパイラはDOS用のコンパイラなので、
Windows用のアプリケーションは作成できません。

サンプルソースをコンパイルしたいのなら、Visual C++ Ver6を
用意するか、無料で使用できるVisual C++ Toolkit 2003+PlatformSDKで
可能です。

無料のコンパイラであれば、その他にもBorland C++ 5.5.1やgccという選択肢もあります。




No.14071

Re:自己レス
投稿者---RAPT(2004/05/17 00:32:23)


本来は、
> cout << data << endl;
とあるところを、szBuff に対して書き出すのですが、環境不明なので書きませんでした。
# → szBuff を関数内でアロケートするか、関数外でアロケートするか等。

訂正2箇所。
> BOOL DownloadFile(LPTSTR szBuff, DWORD& r_dwLength, LPCTSTR lpszSavePath, LPCTSTR lpszUrl)
BOOL DownloadFile(LPTSTR szBuff, DWORD& r_dwLength, LPCTSTR lpszUrl)

> hFile = ::InternetOpenUrl(hInternet, m_strUrl, NULL, 0, 0, 0);
hFile = ::InternetOpenUrl(hInternet, lpszUrl, NULL, 0, 0, 0);

# 言い訳:元のソースが、直接ファイルに書き出す処理だったので…

それから、環境は? と聞かれて、
> OSはXPです。
は酷い回答ですね。折角回答例まで付けたのに。
通常、「開発環境」には、コンパイラの種類とバージョン等を含めます。

> あと参照先のurlはどう指定するのですか?
やってみれば分かるかと。
lpszUrl に "http://www.server.com/~usr/hoge.html" 等と指定するだけ。

VC++6sp6でWindowsアプリケーションとして記述しました。