小傑 於 2008-07-06 15:29:38 發問
有什麼語法能把
指定的網頁中原始檔完整複製下來?
能否其解釋原理
以及運流程呢?
感謝教學!
指定的網頁中原始檔完整複製下來?
能否其解釋原理
以及運流程呢?
感謝教學!
2008-07-06 21:28:31 補充
話說我發問完...
我就找到另外一篇一模一樣的文章了...
所以沒什麼問題了
但是我想問一下
程式一執行馬上就會消失(還在執行)
執行完才會顯示pause的訊息
cout的沒顯示出來耶
為什麼會這樣?
我就找到另外一篇一模一樣的文章了...
所以沒什麼問題了
但是我想問一下
程式一執行馬上就會消失(還在執行)
執行完才會顯示pause的訊息
cout的沒顯示出來耶
為什麼會這樣?
2008-07-06 22:11:55 補充
網頁抓的完整
只是除了system的指令外
程式好像都會自動跳過...
只是除了system的指令外
程式好像都會自動跳過...
2008-07-06 22:16:31 補充
而且我發現
多用幾的pause
程式通過一個pause後就會先關閉
在去執行下一個pause...
多用幾的pause
程式通過一個pause後就會先關閉
在去執行下一個pause...
novus 於 2008-07-06 17:11:26 回答
這個問題剛好之前回答過。
以下程式針對windows平台,應該所有支援Win32的編譯器都可以使用,要讓程式更穩健其實還要加入檢查各種exception的程式碼,這部份可能要麻煩您自行查MSDN。
基本上沒什麼原理好講的,只不過是呼叫windows作業系統內建的Inet API幫你抓網頁。
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <wininet.h>
using namespace std;
const int BUF_SIZE = 1024;
int Download(const string& url, ostream& output) {
char buffer[BUF_SIZE], header[80];
HINTERNET hUrl, hInet;
DWORD rcv, total = 0;
if (InternetAttemptConnect(0) != ERROR_SUCCESS) return 0;
hInet = InternetOpen("download", INTERNET_OPEN_TYPE_DIRECT,
NULL, NULL, 0);
if (hInet == NULL) return 0;
hUrl = InternetOpenUrl(hInet, url.c_str(), header, -1,
INTERNET_FLAG_NO_CACHE_WRITE, 0);
if (hUrl == NULL) return 0;
do {
InternetReadFile(hUrl, &buffer, BUF_SIZE, &rcv);
output.write(buffer, rcv);
total += rcv;
} while (rcv > 0);
InternetCloseHandle(hUrl);
InternetCloseHandle(hInet);
return total;
}
int main() {
ofstream f("test.txt");
int re = Download("http://tw.knowledge.yahoo.com/question/question?qid=1608070605375", f);
cout << "共收到 " << re << " byte. \n";
system("pause");
}
注意事項
1.有些開發環境不會幫你自動連結lib。假如你使用Dev c++,要在 專案>專案選項>參數>連結器 當中加入
[Dev c++所在的路徑]\lib\libwininet.a
2.我剛試了一下發現程式可以執行,卻抓不到網頁,原來是去年重灌防毒軟體有啟用防火牆功能。記得要幫程式留條路 XD
3.盡責的編譯器會丟出一個warning,這是因為將Inet API無理的要求將-1轉換為DWORD,不管它就好。
4.Inet API的細節請洽MSDN
http://msdn.microsoft.com/en-us/library/aa385438.aspx
以下程式針對windows平台,應該所有支援Win32的編譯器都可以使用,要讓程式更穩健其實還要加入檢查各種exception的程式碼,這部份可能要麻煩您自行查MSDN。
基本上沒什麼原理好講的,只不過是呼叫windows作業系統內建的Inet API幫你抓網頁。
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <wininet.h>
using namespace std;
const int BUF_SIZE = 1024;
int Download(const string& url, ostream& output) {
char buffer[BUF_SIZE], header[80];
HINTERNET hUrl, hInet;
DWORD rcv, total = 0;
if (InternetAttemptConnect(0) != ERROR_SUCCESS) return 0;
hInet = InternetOpen("download", INTERNET_OPEN_TYPE_DIRECT,
NULL, NULL, 0);
if (hInet == NULL) return 0;
hUrl = InternetOpenUrl(hInet, url.c_str(), header, -1,
INTERNET_FLAG_NO_CACHE_WRITE, 0);
if (hUrl == NULL) return 0;
do {
InternetReadFile(hUrl, &buffer, BUF_SIZE, &rcv);
output.write(buffer, rcv);
total += rcv;
} while (rcv > 0);
InternetCloseHandle(hUrl);
InternetCloseHandle(hInet);
return total;
}
int main() {
ofstream f("test.txt");
int re = Download("http://tw.knowledge.yahoo.com/question/question?qid=1608070605375", f);
cout << "共收到 " << re << " byte. \n";
system("pause");
}
注意事項
1.有些開發環境不會幫你自動連結lib。假如你使用Dev c++,要在 專案>專案選項>參數>連結器 當中加入
[Dev c++所在的路徑]\lib\libwininet.a
2.我剛試了一下發現程式可以執行,卻抓不到網頁,原來是去年重灌防毒軟體有啟用防火牆功能。記得要幫程式留條路 XD
3.盡責的編譯器會丟出一個warning,這是因為將Inet API無理的要求將-1轉換為DWORD,不管它就好。
4.Inet API的細節請洽MSDN
http://msdn.microsoft.com/en-us/library/aa385438.aspx
2008-07-06 23:35:54 補充
補充編譯須知
* 某些編譯器必須取消專案的unicode選項,才能連結到正確的API版本
(配合std::string c_str()型態..... my fault)
* 如果編譯器吐出一大串XXX未定義,就試著在最前面加個 #include
* 某些編譯器必須取消專案的unicode選項,才能連結到正確的API版本
(配合std::string c_str()型態..... my fault)
* 如果編譯器吐出一大串XXX未定義,就試著在最前面加個 #include
2008-07-07 13:31:20 補充
windows.h




