用c++写的一个词典工具

使用的QT图形界面,用libcurl获取的网页,在之中遇见了很多问题,一直想用c++类封装一下libcurl,发现c++很不到家啊。索性用了友元函数。

先贴上代码吧

main.cpp 

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#include <curl/curl.h>
#include <curl/types.h>
#include <curl/easy.h>

#include <QtGui/QApplication>

#define mydebug 0

using namespace std;

#include "Dict.h"

FILE *fp; //定义FILE类型指针

size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream)
{
    int written = fwrite(ptr, size, nmemb, (FILE *)fp);
    return written;
}

int getpage(QString aUrl)
{
        CURL *curl;

        QString mUrl="";
        mUrl.append("http://dict.baidu.com/s?wd=");
        mUrl.append(aUrl);
        mUrl.append("&tn=dict");

        curl_global_init(CURL_GLOBAL_ALL);
        curl=curl_easy_init();

        QByteArray ba = mUrl.toLatin1();
        const char *c_str2 = ba.data();

        curl_easy_setopt(curl,CURLOPT_URL,c_str2);

        if((fp=fopen("/home/archy/newfile","w"))==NULL)
        {
                curl_easy_cleanup(curl);
                exit(1);
        }

        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);

        curl_easy_perform(curl);
        curl_easy_cleanup(curl);
        return 0;
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    Dialog w;
    w.show();

    return a.exec();
}

Dict.h

#ifndef DICT_H
#define DICT_H

#include <QtGui>
#include "translate.h"
#include "one.h"

class QPushButton;
class QLineEdit;
class QTextEdit;

class Dialog : public QDialog
{
    Q_OBJECT

public:
    Dialog(QWidget *parent = 0);
    ~Dialog();

    friend int getpage(QString aUrl);
    QString getResult();

private slots:
    void clearItem();
    void searchItem();
    void UpdateClearBtn();
    void UpdateSearchBtn();

private:
    QPushButton *mClearBtn;
    QPushButton *mSearchBtn;
    QLineEdit *mItem;
    QTextEdit *mResult;
    one *aone;
};

#endif // DICT_H

 Dict.cpp

1 #include <QtGui/QHBoxLayout>
#include <QtGui/QVBoxLayout>
#include "Dict.h"
#include <QMessageBox>

extern int getpage(QString aUrl);

Dialog::Dialog(QWidget *parent)
    : QDialog(parent)
{
    //init class of translate
    //aone = new one();
    //init controls
    mClearBtn = new QPushButton("Clear");
    mSearchBtn = new QPushButton("Search");

    mClearBtn->setFlat(1);
    mClearBtn->setFixedSize(50,30);
    mSearchBtn->setFlat(1);
    mSearchBtn->setFixedSize(50,30);

    mItem = new QLineEdit;
    mResult = new QTextEdit;

    connect(mClearBtn,SIGNAL(clicked()),this,SLOT(clearItem()));
    connect(mSearchBtn,SIGNAL(clicked()),this,SLOT(searchItem()));

    QHBoxLayout *aHbox = new QHBoxLayout;
    aHbox->addWidget(mClearBtn);
    aHbox->addWidget(mItem);
    aHbox->addWidget(mSearchBtn);

    QVBoxLayout *aVbox = new QVBoxLayout;
    aVbox->addLayout(aHbox);
    aVbox->addWidget(mResult);
    setLayout(aVbox);
}

QString Dialog::getResult()
{
    FILE *fp;

    char tem;
    char buffer[2000],final[200];
    int line = 1,counti=0,token = 0,finalcount=0;

    fp = fopen("/home/archy/newfile","r");

    while((tem = fgetc(fp))!=EOF)
    {
        if(tem=='\n')
        {
              line++;
              if(line==427)
              {
                    break;
              }
        }
            //line++;
    }

    fgets(buffer,2000,fp);

    while(buffer[counti]!='\n' && counti < 2000)
    {
            if(buffer[counti] == '<')
            {
                    token  = 0;
            }
            else if(buffer[counti] == '>')
            {
                    token = 1;
            }
            else if(buffer[counti] != '>' && buffer[counti] != '<' && token == 1)
            {
                    final[finalcount] = buffer[counti];
                    finalcount ++;
            }
            counti ++;
    }

    final[finalcount] = '\0';

    //QMessageBox msgBox;
    //msgBox.setText(final);
    //msgBox.exec();

    //
    QString string = QString(QLatin1String(final));
//    QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GB2312"));
    QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
    return string;
}

void Dialog::clearItem()
{
    mItem->setText("");
}

void Dialog::searchItem()
{

    if(mItem->text() != "")
    {
        getpage(mItem->text());
        QString astring = getResult();

        //QMessageBox msgBox;
        //msgBox.setText(astring);
        //msgBox.exec();

        mResult->setText(astring);
    }
}

Dialog::~Dialog()
{

}

还有一个问题就是乱码的问题。

 因为是提取的网页,只能一个char一个char那样提取,现在还是没有想到什么其他办法提取。之后在char[] 转 QString 的时候,总是乱码。

 

 哪位博友知道怎么解决的话,请给点线索。 

时间: 2024-10-27 22:54:32

用c++写的一个词典工具的相关文章

2010年写的一个小工具发现原来只需一行命令即可!

 2010年写的一个小工具发现原来只需一行命令即可! 时间过得很快,转眼间2016年下半年了, 2010年写过一个小工具:http://blog.csdn.net/yangzhenping/article/details/5333184 ping一个网段的cmd程序  http://download.csdn.net/source/2084490 今天发现只要在cmd命令行工具中输入: FOR /L %i IN (1,1,254) DO ping -n 1 192.168.1.%i 即可.

java代码-我用Java 写的一个简单截图小工具 但是出现一些在重截时出现bug 跪求大神

问题描述 我用Java 写的一个简单截图小工具 但是出现一些在重截时出现bug 跪求大神 /**在这里贴上我注释满满的代码 求一语道破 求建议 求批评 没有贴main 方法 随便写个main方法便可运行 */ ` package com.subimaga; import java.awt.AWTException; import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Cursor; import java.

[原创]我写的一个观察系统进程特定虚拟地址页PTE的工具

观察系统进程特定虚拟地址页PTE的工具 关键词:虚拟地址,PTE     为了便于研究windows内核,我写了一个察看系统中特定进程虚拟地址页的PTE工具, CPP v1.0(Check Process PTE),界面图1所示:                                                                                                                         图1 值得注意的是,在 PD

【求助】用Python写出一个遍历网站所有url的小工具

问题描述 [求助]用Python写出一个遍历网站所有url的小工具 用Python 怎么写出一个 遍历网站所有url的小工具, 包括首页的url和所有子网页url 不能有重复的url,我自己写的只能遍历一个网页的 首页,子网页的遍历不出来,新人 没币 ,求好心人帮助!!! 解决方案 http://www.cnblogs.com/fnng/p/3576154.htmlhttp://www.oschina.net/code/list_releted_codes?id=25402 解决方案二: htt

sqlserver-尝试写了一个 JDBC 操作 SQLServer 的工具类,但是好像有问题,求大神帮忙指正

问题描述 尝试写了一个 JDBC 操作 SQLServer 的工具类,但是好像有问题,求大神帮忙指正 java新人,尝试写了一个 JDBC 操作 SQLServer 的工具类,但是好像有问题,调用 insert 指令没问题,而 select 指令出现如下报错: com.microsoft.sqlserver.jdbc.SQLServerException: ')' 附近有语法错误. at com.microsoft.sqlserver.jdbc.SQLServerException.makeFr

自己写了一个最简单的文件复制工具,但是却不能复制,请大家帮忙看看

问题描述 自己写了一个最简单的文件复制工具,但是却不能复制,请大家帮忙看看usingSystem;usingSystem.IO;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Windows.Forms;namespace文件复制移动删除{publicpartia

新手写的一个队数组操作的工具类,提供给大家

问题描述 新手写的一个队数组操作的工具类,提供给大家@param本程序为一个单独的工具类,内部没有入口函数,只需要在主函数中调用本类即可@param调用方法1.如果你用的是记事本类的编写工具,只需要将class文件放到你的代码下,设置classpath2.如果你是用的eclipse专用编写工具你需要先将class文件打包:打包命令为jar-cvfarrtool.jar*.*然后添加外置包即可.1.这个是jar文件2.这个是class文件http://download.csdn.net/detai

利用反射自己写的一个ModelHelper类

开发中 很多人都会使用BLL Model这种开发,我也是,虽然现在有很多的自动生成工具,能在几秒内生成cs的模板,但我个人还不是很喜欢,我还是喜欢自己一个一个去写,这样更能了解自己的代码. 不过手动编写的时候,最讨厌的就是GetModel这类方法了,把datarow的数据转换成一个Model,实在写的我头疼,因为很多代码基本上都是一样的,一直想用反射来写这样一个方法,以后只要调用一个方法就能完成Model的赋值,那样就方便了.今天又遇到此类代码了,一时火大,自己写了个方法,采用的反射的原理(从B

自己写的一个链表应用程序

    进入程序主界面,你有6个选项,下面一一介绍: *********************************************************         (0)退出         (1)创建新单词         (2)保存已有单词         (3)载入单词表         (4)听写单词开始         (5)浏览单词表         (6)查找单词或释义 *********************************************