红联Linux门户
Linux帮助

linux c语言备忘录

发布时间:2014-08-22 10:51:13来源:红联作者:783456910
简介:使用c语言开发,使用mysql数据库,存放各种资料如:电话号码,各种概念定义。有意思一起做的留言啊。
文章评论

共有 15 条评论

  1. jason_iii 于 2015-09-10 15:30:23发表:

    不错不错

  2. 783456910 于 2015-08-16 06:18:17发表:

    加油,菜鸟

  3. zhaojj 于 2014-12-26 22:32:45发表:

    加油

  4. leolindaming 于 2014-12-26 20:56:40发表:

    厉害,顶

  5. chenhuanglin 于 2014-11-21 08:48:11发表:

    好难哦

  6. 陈宇水 于 2014-10-24 08:19:14发表:

    感觉好牛逼啊

  7. 783456910 于 2014-10-19 13:38:39发表:

    顶,

  8. 783456910 于 2014-10-14 11:41:43发表:

    顶,不要沉,还在继续制作
    已解决treeview添加和清空问题.
    待解决:新建记录,当前记录的修改及保存.以及英文chat模式.

  9. 783456910 于 2014-10-08 10:13:42发表:

    上一张运行测试图:
    输入.exit就退出了。

  10. 783456910 于 2014-10-08 09:54:56发表:

    代码好乱,好粗糙。
    做过这个的朋友指点一下呗,谢谢!

  11. 783456910 于 2014-10-08 09:48:31发表:

    [i=s] 本帖最后由 783456910 于 2014-10-8 10:17 编辑 [/i]

    (*首次明确编写目的:简单的记录数据,实现增删改查,实现模糊查询,实现全键盘操作*)
    边学习边编太痛苦了,一个问题都要查询很长时间。
    1、解决远程查询到ubuntu server 13下mysql数据库中文乱码问题
    2、解决不能远程登录数据库问题。
    3、解决本地结构体存储查询到的记录。
    未解决问题:不强制转换类型编绎警告,记录插入、修改、模糊查询(用正则表达式),填充treeview,treeview选中事件。
    #include
    #include//键值判断
    #include
    #include "allstruct.h"
    GtkTextBuffer *buffer1;//显示文本框的buffer
    GtkTextBuffer *buffer2;//输入文本框的buffer
    gchar *textcmd,*msg;//命令字符串
    GtkTextIter start,end;//当前行和起始行的位置
    GtkTextIter iter;//为得到行号和列号
    gint row,col;//得到行号和列号
    GtkWidget *tree;//设置成全局,否则不能用
    static MYSQL my_connection;
    static gint dbconnected=0;
    struct mysqldata mydata;//保存数据
    gchar *columnname[5];
    void tree_init(GtkTreeView *tree)
    {//测试treeview的函数
    enum{MYID_COLUMN,TITLE_COLUMN,AUTHOR_COLUMN,STATUS_COLUMN,NBR_COLUMN};
    GtkTreeViewColumn *column;
    GtkCellRenderer *renderer;
    GtkTreeIter iter;
    GtkTreeSelection *select;
    GtkListStore *store;
    store=gtk_list_store_new(NBR_COLUMN,G_TYPE_INT,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_FLOAT);
    gtk_list_store_append(store,&iter);
    gtk_list_store_set(store,&iter,
    MYID_COLUMN,1,
    TITLE_COLUMN,"美 kjsdfkdjsfkdjjf 丽大草原",
    AUTHOR_COLUMN,"不知道",
    STATUS_COLUMN,10.0,-1);
    gtk_list_store_append(store,&iter);
    gtk_list_store_set(store,&iter,
    MYID_COLUMN,2,
    TITLE_COLUMN,"美丽大草原",
    AUTHOR_COLUMN,"不知道",
    STATUS_COLUMN,10.0,-1);


    gtk_tree_view_set_model(tree,GTK_TREE_MODEL(store));
    renderer=gtk_cell_renderer_text_new();
    g_object_set(G_OBJECT(renderer),"foreground","red",NULL);
    column=gtk_tree_view_column_new_with_attributes("标题",renderer,"text",TITLE_COLUMN,NULL);
    gtk_tree_view_append_column(tree,column);
    }
    void on_command(gchar *textcmd)
    {
    if(*textcmd=='.')
    {
    //cmd=g_strdup_printf("首字母=%c",*cmd);
    //gtk_text_buffer_set_text(buffer1,cmd,-1);
    // gtk_text_buffer_get_end_iter(buffer2,&end);
    // gtk_text_buffer_insert(buffer2,&end,"\n这是一条命令",-1);
    if(strcasecmp(textcmd,".exit")==0)
    {
    on_quit();
    }
    }else{
    //gtk_text_buffer_set_text(buffer1,cmd,-1);//测试用的
    on_search(textcmd);
    }
    }
    void get_command(GtkTextBuffer *buffer,gpointer data)
    { //textview2回车事件函数,获得命令文件,也就是textview2中的文本
    //关联iter
    gtk_text_buffer_get_iter_at_mark(buffer2,&iter,gtk_text_buffer_get_insert(buffer2));
    row=gtk_text_iter_get_line(&iter);//得到当前行号
    // col=gtk_text_iter_get_line_offset(&iter);//得到当前列号
    gtk_text_buffer_get_iter_at_line_offset(buffer2,&start,row,0);//当前行位置
    gtk_text_buffer_get_iter_at_offset(buffer2,&end,-1);//到buffer最后的位置
    //命令文本gchar*
    textcmd=(gchar*)gtk_text_buffer_get_text(buffer2,&start,&end,FALSE);
    on_command(textcmd);
    //msg=g_strdup_printf("行=%d,列=%d",row,col);
    //gtk_text_buffer_set_text(buffer1,msg,-1);
    }


    gboolean textview2_key_value(GtkWidget *widget,GdkEventKey *event,gpointer data)
    {//textview2判断按键并处理函数
    switch(event->keyval)
    {
    case GDK_KEY_Return:
    //在此调用回车键函数
    get_command(buffer2,NULL);
    break;
    default:
    break;
    }
    return FALSE;
    }
    int main(int argc,char *argv[])
    {//main主函数
    GtkBuilder *builder;
    GtkWidget *window;
    GtkWidget *view2,*view1;
    gtk_init(&argc,&argv);//初始化
    builder=gtk_builder_new();//开始从glade文件创建或连接
    gtk_builder_add_from_file(builder,"mem.glade",NULL);
    gtk_builder_connect_signals(builder,NULL);
    window=GTK_WIDGET(gtk_builder_get_object(builder,"window1"));//得到主窗体
    gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
    tree=GTK_WIDGET(gtk_builder_get_object(builder,"treeview1"));
    tree_init(GTK_TREE_VIEW(tree));
    view1=GTK_WIDGET(gtk_builder_get_object(builder,"textview1"));
    buffer1=gtk_text_view_get_buffer(GTK_TEXT_VIEW(view1));
    view2=GTK_WIDGET(gtk_builder_get_object(builder,"textview2"));
    buffer2=gtk_text_view_get_buffer(GTK_TEXT_VIEW(view2));
    database_start();

    g_signal_connect(G_OBJECT(window),"delete_event",G_CALLBACK(on_quit),NULL);//点窗口右上角的X销毁退出窗口和进程。
    g_signal_connect(G_OBJECT(view2),"key-press-event",G_CALLBACK(textview2_key_value),NULL);
    g_object_unref(G_OBJECT(builder));
    gtk_widget_show(window);
    gtk_main();

    return 0;
    }
    int database_start()
    {
    if(dbconnected)
    {
    return 1;
    }
    gtk_text_buffer_get_end_iter(buffer2,&end);
    mysql_init(&my_connection);
    if(!mysql_real_connect(&my_connection,"远程数据库IP地址","用户名","密码","数据库名",0,NULL,0))
    {
    gtk_text_buffer_insert(buffer2,&end,"连接数据库失败!\n",-1);
    msg=g_strdup_printf("\n%s",mysql_error(&my_connection));
    gtk_text_buffer_insert(buffer2,&end,msg,-1);
    return 0;
    }
    // gtk_text_buffer_insert(buffer2,&end,"数据库连接成功!\n",-1);
    if(!mysql_set_character_set(&my_connection,"utf8"))
    {
    // gtk_text_buffer_insert(buffer2,&end,"设置utf8字符集成功\n",-1);
    }
    //mysql_query(&my_connection,"set names utf8");
    // mysql_query(&my_connection,"set names 'utf8'");
    dbconnected=1;
    return 1;
    }
    void database_end()
    {
    if(dbconnected)
    {
    mysql_close(&my_connection);
    dbconnected=0;
    // gtk_text_buffer_insert(buffer2,&end,"\n数据库关闭成功!",-1);
    }
    }
    void on_quit()
    {
    if(dbconnected)
    {
    database_end();
    }
    gtk_main_quit();
    }
    int on_search(gchar *data)
    {
    MYSQL_RES *res_ptr;
    MYSQL_FIELD *field;
    MYSQL_ROW *result_row;
    int res;
    int row,column;
    int i,j;
    gchar qs[200];

    if(!dbconnected){return 0;}
    sprintf(qs,"SELECT * FROM main");
    //where title='how'");
    mysql_query(&my_connection,"set names 'utf-8'");
    // res=mysql_query(&my_connection,"insert into main values(0,0,'第一条','内容',0)");
    res=mysql_query(&my_connection,qs);

    if(res)
    {
    gtk_text_buffer_insert(buffer2,&end,"出错",-1);
    }else{
    res_ptr=mysql_store_result(&my_connection);
    if(res_ptr){
    if(mysql_num_rows(res_ptr)==0)
    {
    return 0;
    }
    column=mysql_num_fields(res_ptr);
    row=mysql_num_rows(res_ptr)+1;
    for(i=0;field=mysql_fetch_field(res_ptr);i++)
    {
    columnname[i]=g_strdup_printf("%s:\n",field->name);
    }
    gtk_text_buffer_get_end_iter(buffer1,&iter);
    for(i=1;i {
    result_row=(MYSQL_ROW *)mysql_fetch_row(res_ptr);
    mydata.id=(gint)result_row[0];
    mydata.uid=(gint)result_row[1];
    mydata.title=(gchar *)result_row[2];
    mydata.context=(gchar *)result_row[3];
    mydata.ct=(gint)result_row[4];
    if(strcasecmp(mydata.title,data)==0)
    {
    for(j=2;j {
    msg=g_strdup_printf("%s",result_row[j]);
    //gtk_text_buffer_insert(buffer1,&iter,columnname[i],-1);
    // gtk_text_buffer_insert(buffer1,&iter,columnname[j],-1);
    gtk_text_buffer_insert(buffer1,&iter,"id",-1);
    gtk_text_buffer_insert(buffer1,&iter,msg,-1);
    gtk_text_buffer_insert(buffer1,&iter,"\n",-1);
    }
    break;
    }
    }

    }
    mysql_free_result(res_ptr);
    }
    return 1;
    }

  12. 783456910 于 2014-10-08 09:37:00发表:

    以下是allstruct.h:
    struct mysqldata{//保存从数据库中取出的数据
    int id;
    int uid;
    gchar *title;
    gchar *context;
    int ct;
    };
    int database_start();//连接远程数据库
    void database_end();//关闭远程数据库,在下面那个退出函数中调用,
    void on_quit();//退出函数,在此函数中关闭数据库
    int on_add(struct mysqldata *data);//新建添加一条数据
    int on_search(gchar *kwd);//查询信息
    int on_update(gint id,struct mysqldata *data);//更新记录
    int on_delete(gint id);//删除记录

  13. 回首的曾经 于 2014-09-29 17:30:56发表:

    无回帖,不论坛,这才是人道。

  14. 783456910 于 2014-09-29 16:07:12发表:

    [i=s] 本帖最后由 783456910 于 2014-9-29 19:30 编辑 [/i]

    经过使用ubuntu的摸索,于2014.09.11格掉xp安装debian,09月27日开始准备制作这个备忘录,因为刚接触gtk和glade(谢谢在网上发布资料的同学),有错误希望大家指正(本人纯业余自学,边学边做)。以下是实现日志:
    2014.09.29 星期一
    一、glade绘制界面,见附件。
    1.只有三个可见部分:treeview1(左),textview1(右上),textview2(右下)。
    2.在textview2中输入的文本作为命令,按回车执行。
    打算在两个textview中使用类似vim的两种模式,一种是命令模式,一种是编辑模式。不过太难了,还在探索中。
    3.textview1作为主要内容显示来使用。
    4.treeview1作为查找到的所有标题(关键字)列表。
    二、编程部分:
    1、解决textview的buffer到gchar*的转换。
    2、解决gtk textview按回车得到当前行文本的问题(整整查了两天的资料啊,晕)。
    这个“当前行文本”是作为命令来用的。代码如下:
    #include
    #include//键值判断
    GtkTextBuffer *buffer1;//显示文本框textview1的buffer
    GtkTextBuffer *buffer2;//输入文本框textview2的buffer
    gchar *textcmd,*msg;//命令字符串,解析textcmd以执行各种命令
    GtkTextIter start,end;//当前行开头到结尾的位置。(话说Iter是什么东西,搞得我都不会描述了)
    GtkTextIter iter;//为得到行号和列号声明的
    gint row,col;//得到行号和列号储存在这里
    void mode_command(GtkTextBuffer *buffer,gpointer data)
    { //textview2回车事件函数
    //下面一行是关联iter的,然后就可以用iter了。具体不太明白
    gtk_text_buffer_get_iter_at_mark(buffer2,&iter,gtk_text_buffer_get_insert(buffer2));
    row=gtk_text_iter_get_line(&iter);//得到当前行号,已用。
    col=gtk_text_iter_get_line_offset(&iter);//得到当前列号,还没用到。
    gtk_text_buffer_get_iter_at_line_offset(buffer2,&start,row,0);//当前行开始位置
    gtk_text_buffer_get_iter_at_offset(buffer2,&end,-1);//到buffer结尾的位置(当前行结尾的位置)
    //命令文本gchar*
    textcmd=(char*)gtk_text_buffer_get_text(buffer2,&start,&end,FALSE);//取得当前行,存入textcmd
    gtk_text_buffer_set_text(buffer1,textcmd,-1);//测试用的,以后删除。
    //msg=g_strdup_printf("行=%d,列=%d",row,col);//gint转char*函数
    //gtk_text_buffer_set_text(buffer1,msg,-1);
    }
    gboolean textview2_key_value(GtkWidget *widget,GdkEventKey *event,gpointer data)
    {//textview2判断按键并处理函数
    switch(event->keyval)
    {
    case GDK_KEY_Return:
    //在此调用回车键函数
    mode_command(buffer2,NULL);
    break;
    default:
    break;
    }
    return FALSE;
    }
    int main(int argc,char *argv[])
    {//main主函数
    GtkBuilder *builder;
    GtkWidget *window;
    GtkWidget *view2,*view1;
    gtk_init(&argc,&argv);//初始化
    builder=gtk_builder_new();//开始从glade文件创建或连接
    gtk_builder_add_from_file(builder,"mem.glade",NULL);
    gtk_builder_connect_signals(builder,NULL);
    window=GTK_WIDGET(gtk_builder_get_object(builder,"window1"));//得到主窗体
    gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
    view1=GTK_WIDGET(gtk_builder_get_object(builder,"textview1"));
    buffer1=gtk_text_view_get_buffer(GTK_TEXT_VIEW(view1));
    view2=GTK_WIDGET(gtk_builder_get_object(builder,"textview2"));
    buffer2=gtk_text_view_get_buffer(GTK_TEXT_VIEW(view2));
    g_signal_connect(G_OBJECT(window),"delete_event",G_CALLBACK(gtk_main_quit),NULL);//点窗口右上角的X销毁退出窗口和进程。
    g_signal_connect(G_OBJECT(view2),"key-press-event",G_CALLBACK(textview2_key_value),NULL);
    g_object_unref(G_OBJECT(builder));
    gtk_widget_show(window);
    gtk_main();

    return 0;
    }
    大家看下代码,有问题留言。

  15. looeta 于 2014-08-23 08:48:27发表:

    还没这个水准