标题:写了个唐诗组合任务小程序,有兴趣大家研究一下。
只看楼主
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
得分:0 
回复 39楼 zaixuexi
谢谢Z版赐教,继续学习你改进的代码。

梅尚程荀
马谭杨奚







                                                       
2012-02-05 14:16
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
得分:0 
回复 40楼 爱德华
谢谢 还很不成熟呢。

梅尚程荀
马谭杨奚







                                                       
2012-02-05 14:17
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
得分:0 
zaixuexi版版,为什么要写这个:
typedef int int32_t;
typedef void(*dummy)(void);
#define BUG_ON(expr)    assert(!(expr))
貌似都是一些字符转换,而且还多了很多字符,有什么好处吗,还是一个习惯问题?

梅尚程荀
马谭杨奚







                                                       
2012-02-05 15:03
闲出屁
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:7
帖 子:420
专家分:612
注 册:2012-1-24
得分:5 
弄了一个批量下载唐诗的程序 发出来大家没事儿发挥下
写的比较乱 对付看吧 很多地方都没怎么斟酌 有些还是从网上down的代码 不对的地方大家一起改吧
用的是socket获取html源码 然后解析标签 把数据保存到xml文件里 没用多线程 效率比较低
加多线程相信效果好很多
建的是WIN MFC控制台工程 主要是想用CSTRING 方便处理字符串 用char处理太麻烦了
程序代码:
#include <stdio.h>
#include <winsock.h>
#include <string.h>
#include <afxinet.h>
#include <algorithm>
#include <afxdhtml.h>
#include <vector>

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

CString geturl(char *url)
{
    CString strHtml;

    WSADATA WSAData={0};
    SOCKET sockfd;
    struct sockaddr_in addr;
    struct hostent *pURL;
    char myurl[BUFSIZ];
    char *pHost = 0, *pGET = 0;
    char host[BUFSIZ], GET[BUFSIZ];
    char header[BUFSIZ] = "";
    static char text[BUFSIZ];
    int i; 

    /*
    * windows下使用socket必须用WSAStartup初始化,否则不能调用
    */
    if(WSAStartup(MAKEWORD(2,2), &WSAData))
    {
        printf("WSA failed\n");
        return strHtml;
    } 

    /*
    * 分离url中的主机地址和相对路径
    */
    strcpy(myurl, url);
    for (pHost = myurl; *pHost != '/' && *pHost != '\0'; ++pHost);
    if ( (int)(pHost - myurl) == strlen(myurl) )
        strcpy(GET, "/");
    else
        strcpy(GET, pHost);
    *pHost = '\0';
    strcpy(host, myurl);
    //printf("%s\n%s\n", host, GET); 

    /*
    * 设定socket参数,并未真正初始化
    */
    sockfd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
    pURL = gethostbyname(host);
    addr.sin_family = AF_INET;
    addr.sin_addr.s_addr = *((unsigned long*)pURL->h_addr);
    addr.sin_port = htons(80); 

    /*
    * 组织发送到web服务器的信息
    * 为何要发送下面的信息请参考HTTP协议的约定
    */
    strcat(header, "GET ");
    strcat(header, GET);
    strcat(header, " HTTP/1.1\r\n");
    strcat(header, "HOST: ");
    strcat(header, host);
    strcat(header, "\r\nConnection: Close\r\n\r\n"); 

    /*
    * 连接到服务器,发送请求header,并接受反馈(即网页源代码)
    */
    connect(sockfd,(SOCKADDR *)&addr,sizeof(addr)); 

    send(sockfd, header, strlen(header), 0); 

    while ( recv(sockfd, text, BUFSIZ, 0) > 0)
    {
        //printf("%s", text);
        strHtml += text;
        strnset(text, '\0', BUFSIZ);
    } 

    closesocket(sockfd); 

    WSACleanup(); 

    return strHtml;
} 

// 唯一的应用程序对象

CWinApp theApp;

using namespace std;

CString GetElementAttr(CComPtr<IHTMLElement> sp, CString strAttr)
{
    VARIANT var;
    BSTR bsAttr = strAttr.AllocSysString();
    HRESULT hr = S_OK;
    hr = sp->getAttribute(bsAttr, 0, &var);
    ::SysFreeString(bsAttr);
    if (hr == S_OK && var.vt != VT_NULL)
        return CString(var.bstrVal);
    else
        return CString("");
}
CString GetElementInnerHTML(CComPtr<IHTMLElement> sp)
{
    BSTR bsHtml;
    sp->get_innerHTML(&bsHtml);
    return CString(bsHtml);
}
CString GetElementInnerText(CComPtr<IHTMLElement> sp)
{
    BSTR bsText;
    sp->get_innerText(&bsText);
    return CString(bsText);
}
CString GetElementClassName(CComPtr<IHTMLElement> sp)
{
    BSTR bsClass;
    sp->get_className(&bsClass);
    return CString(bsClass);
}
BOOL GetElementByCollection(CComPtr<IHTMLElementCollection> elementCollection, int nIndex, void** ppElem)
{
    HRESULT hr = S_OK;
    IDispatch *pDispInputText = NULL;  
    CComVariant vIndex=nIndex;  
    elementCollection->item(vIndex,vIndex,&pDispInputText);
    hr=pDispInputText->QueryInterface(IID_IHTMLElement,ppElem);
    return hr == S_OK;
}
CString GetElementTagName(CComPtr<IHTMLElement> sp)
{
    BSTR bsAttr;
    sp->get_tagName(&bsAttr);
    return CString(bsAttr);
}
CString GetElementId(CComPtr<IHTMLElement> sp)
{
    BSTR bsId;
    sp->get_id(&bsId);
    return CString(bsId);
}

void GetTopDocumentFromUrl(CString url,CComQIPtr<IHTMLDocument2>& pDoc)
{
    CoInitialize(NULL);

    CString strHtml = geturl(url.GetBuffer());
    BSTR bs = strHtml.AllocSysString();
    HRESULT hr = CoCreateInstance(CLSID_HTMLDocument, NULL, CLSCTX_INPROC_SERVER,IID_IHTMLDocument2, (void**)&pDoc.p);
    SAFEARRAY* psa = SafeArrayCreateVector(VT_VARIANT,0,1);
    VARIANT* param;
    hr = SafeArrayAccessData(psa, (LPVOID*)&param);
    param->vt = VT_BSTR;
    param->bstrVal = bs;
    pDoc->write(psa);
    ::SysFreeString(bs);
}
struct ShiCi
{
    CString strName;
    CString strWriter;
    CString strContext;
};

BOOL GetShiCiFromUrl(CString strUrl, ShiCi & sc)
{
    HRESULT hr = S_OK;
    CComQIPtr<IHTMLDocument2> pDoc;
    GetTopDocumentFromUrl(strUrl, pDoc);
    CComQIPtr<IHTMLElement> spTop;
    pDoc->get_body(&spTop);

    CComQIPtr<IHTMLElementCollection> spCol;
    CComPtr<IDispatch> pDispatch;
    hr = spTop->get_all(&pDispatch);
    hr = pDispatch->QueryInterface(IID_IHTMLElementCollection, (VOID**)&spCol);       
    long len;
    spCol->get_length(&len);

    int num = 0;
    for (int c=0; c<len; c++)
    {
        CComPtr<IHTMLElement> spP1;

        if (GetElementByCollection(spCol, c, (void**)&spP1) && GetElementClassName(spP1) == "HeightBorderCenter")
        {
            if (num == 0)
            {
                sc.strName = GetElementInnerText(spP1);
            }
            else if (num == 1)
            {
                sc.strWriter = GetElementInnerText(spP1);
            }
            else if (num == 2)
            {
                sc.strContext = GetElementInnerText(spP1);
            }
            num ++;
        }
    }
    if (num < 3)
        return FALSE;
    return TRUE;
}
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
    int nRetCode = 0;

    // 初始化 MFC 并在失败时显示错误
    if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
    {
        // TODO: 更改错误代码以符合您的需要
        _tprintf(_T("错误: MFC 初始化失败\n"));
        nRetCode = 1;
    }
    else
    {
        // TODO: 在此处为应用程序的行为编写代码。
    }

    std::vector<ShiCi> arrShiCi;
    int nStart = 101;
    int nEnd = 140;
    for (int i=nStart; i<nEnd; i++)
    {
        ShiCi sc;
        CString strUrl;
        strUrl.Format("www.", i);
        if (GetShiCiFromUrl(strUrl, sc))
            arrShiCi.push_back(sc);
        system("cls");
        printf("共%d个,已经完成%d个,获取%d个诗词\n", nEnd-nStart, i-nStart+1, arrShiCi.size());

        //////////////////////////////////////////////////////////////////////////
        // 这么保存保险一点
        FILE* fp = fopen("out.xml", "wt");
        if (fp == NULL)
            return 0;
        fprintf(fp, "<?xml version=\"1.0\" encoding=\"gb2312\"?>\n");
        fprintf(fp, "<root>\n");
        for (int j=0; j<arrShiCi.size(); j++)
        {
            fprintf(fp, "<sc%d>\n", j);

                fprintf(fp, "<Name>\n");
                fprintf(fp, "%s\n", arrShiCi[j].strName);
                fprintf(fp, "</Name>\n");

                fprintf(fp, "<Writer>\n");
                fprintf(fp, "%s\n", arrShiCi[j].strWriter);
                fprintf(fp, "</Writer>\n");

                fprintf(fp, "<Context>\n");
                fprintf(fp, "%s\n", arrShiCi[j].strContext);
                fprintf(fp, "</Context>\n");

            fprintf(fp, "</sc%d>\n", j);
        }
        fprintf(fp, "</root>\n");
        fclose(fp);
    }
    return nRetCode;
}

乔布斯是神 宫崎骏也是神~~ 才知道 原来士兵突击的主题曲是久石让的 久石让的音乐 真传神
2012-02-05 17:26
闲出屁
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:7
帖 子:420
专家分:612
注 册:2012-1-24
得分:0 
SorcketGetHtml.rar (8.81 KB)

  <?xml version="1.0" encoding="gb2312" ?>
- <root>
- <sc0>
  <Name>感遇·其一</Name>
  <Writer>张九龄</Writer>
  <Context>兰叶春葳蕤,桂华秋皎洁。 欣欣此生意,自尔为佳节。 谁知林栖者,闻风坐相悦。 草木有本心,何求美人折?</Context>
  </sc0>
- <sc1>
  <Name>感遇·其二</Name>
  <Writer>张九龄</Writer>
  <Context>江南有丹桔,经冬犹绿林。 岂伊地气暖,自有岁寒心。 可以荐佳客,奈何阻重深。 运命唯所遇,循环不可寻。 徒言树桃李,此木岂无阴。</Context>
  </sc1>
- <sc2>
  <Name>下终南山过斛斯山人宿置酒</Name>
  <Writer>李白</Writer>
  <Context>暮从碧山下,山月随人归。 却顾所来径,苍苍横翠微。 相携及田家,童稚开荆扉。 绿竹入幽径,青萝拂行衣。 欢言得所憩,美酒聊共挥。 长歌吟松风,曲尽河星稀。 我醉君复乐,陶然共忘机。</Context>
  </sc2>
  </root>


乔布斯是神 宫崎骏也是神~~ 才知道 原来士兵突击的主题曲是久石让的 久石让的音乐 真传神
2012-02-05 17:31
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
得分:0 
回复 44楼 闲出屁
这个都够我学习好久了,真强悍啊。

梅尚程荀
马谭杨奚







                                                       
2012-02-05 17:44
zaixuexi
Rank: 12Rank: 12Rank: 12
来 自:上海
等 级:火箭侠
威 望:8
帖 子:858
专家分:3233
注 册:2010-12-1
得分:0 
回复 43楼 有容就大
不写也可以的,写了么更清楚一点
你的问题是代码太乱,不细看根本不知道你写的什么逻辑,代码要简洁,干净,有层次,最好还要面向对象

技术问题,请不要以短消息方式提问
2012-02-05 18:07
吴小君
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:102
专家分:198
注 册:2012-1-2
得分:5 
顶一下

小弟学习C语言刚入门,请大侠们多多指教,不吝赐解!
2012-02-05 20:34
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
得分:0 
回复 45楼 闲出屁
:\program files\microsoft visual studio\vc98\mfc\include\afxv_w32.h(14) : fatal error C1189: #error :  WINDOWS.H already included.  MFC apps must not #include <windows.h>
执行 cl.exe 时出错.

10007.obj - 1 error(s), 0 warning(s)
编译出这个错误?什么意思。

梅尚程荀
马谭杨奚







                                                       
2012-02-05 23:37
闲出屁
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:7
帖 子:420
专家分:612
注 册:2012-1-24
得分:0 
我用的是VS2008 建的是WIN32 控制台 --- MFC 工程

乔布斯是神 宫崎骏也是神~~ 才知道 原来士兵突击的主题曲是久石让的 久石让的音乐 真传神
2012-02-05 23:41



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-360398-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.854455 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved