QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1968|回复: 12

RamMaker开发文档(送给gtk菜鸟的示例程序)

[复制链接]
发表于 2006-2-3 20:45:13 | 显示全部楼层 |阅读模式
RamMaker开发文档
破碎细胞 <[email protected]>
Under BSDL
此文也许很垃圾,但我仍希望它能对人们有用

序言

        本人是不折不扣的菜鸟一个,一直在学习GTK+C的道路上摸索。刚起步时,一切对于像我这样一个门外汉来说,都是那么陌生。虽然硬

啃了很多资料,可还是不太清楚,很希望能看一些初级的示例程序。结果找到的示例大都是英文写的,且比较复杂。这给我的学习增添了很多

困难。

        我想,也许多数GTK+C的初学者都希望能得到写有详细中文注释或者说明的示例程序以做参考──这就是我写此文的目的。

       
一、RamMaker的起因
        Realplay是一款很受人欢迎的媒体播放软件,各项功能都比较强大。可美中不足的是它的Unix版本没有提供播放列表功能,这给日常

使用带来了很多不便。所以我决定写一个小程序,来弥补这个不足。
       
二、RamMaker的原理
        Realplay提供了一种播放列表的文件类型,即ram文件。用文本编辑器打开一个现成的ram文件,发现它就是一个媒体资源的URL列表。

内容如下
       
        file://mydoc/music/我的爱.mp3
        file://mydoc/music/了解.rm
        ……

这样,RamMaker的原理也就出来了:将一个文件列表以如上格式写入一个ram文件。很简单,不是吗?

三、具体实现
        1、界面
                我是懒人一个,所以就用glade生成了GUI界面部分的代码。这样,比较方便:-)
               
        2、工作流程
                读取用户输入的目录路径-->用打开管道(类似文件的操作)获取目录的文件列表-->将文件列表加载到GUI界面的列表里-->等

待用户对列表的编辑-->把储存在GUI列表里的文件信息写入指定的ram文件-->程序完成
       
        3、代码实现
                请具体看/src下的代码,里面有详细中文注释
http://www.linuxfans.org/nuke/mo ... fo&did=4141
发表于 2006-2-3 21:50:34 | 显示全部楼层
正要看看管道的问题
回复

使用道具 举报

 楼主| 发表于 2006-2-3 21:59:07 | 显示全部楼层
[quote:5b58a6c20d="BOoRFGOnZ"]正要看看管道的方法  [/quote]
我只用了很初级的管道,希望别见笑 :D
回复

使用道具 举报

发表于 2006-2-3 22:10:39 | 显示全部楼层
[code:1]
...
....
FILE *pipe;
char file_name[255],temp;
gchar *row[2];
const gchar *path;
int file_name_length=-1,i;

        path = gtk_entry_get_text (GTK_ENTRY (entry_path));
        chdir("/");//若输入的路径错误,即转入"\"目录
        chdir(path);
        if ((pipe=popen("ls","r"))==NULL)
                return(1);
..
..[/code:1]
我也用过类似的方法 但是 anjuta老是提示 FILE类型的管道变量没有初始化(明明初始化了)  有点晕   
回复

使用道具 举报

发表于 2006-2-3 22:14:23 | 显示全部楼层
[code:1]        ....
...
..
while((temp=fgetc(pipe))!=EOF)
                {
                ungetc(temp,pipe);
                i=0;
                while((temp=fgetc(pipe))!='\n')
                        {
                        file_name[i]=temp;
                        i++;
                        }
...
...[/code:1]
这个样子一个一个的读 不如用fgets(file_name,sizeof(file_name),pipo)一读 读一堆..
不过我试过..结尾有意向不到了乱码  :D
回复

使用道具 举报

发表于 2006-2-3 22:18:11 | 显示全部楼层
不是乱码 是 些转义字符
回复

使用道具 举报

 楼主| 发表于 2006-2-3 22:24:07 | 显示全部楼层
[quote:359d446aa9="BOoRFGOnZ"][code:1]        ....
...
..
while((temp=fgetc(pipe))!=EOF)
                {
                ungetc(temp,pipe);
                i=0;
                while((temp=fgetc(pipe))!='\n')
                        {
                        file_name[i]=temp;
                        i++;
                        }
...
...[/code:1]
这个样子一个一个的读 不如用fgets(file_name,sizeof(file_name),pipo)一读 读一堆..
不过我试过..结尾有意向不到了乱码  :D[/quote]

这样做便于人工在末尾添加\0标记,就可以避免奇怪的转义符 :D
回复

使用道具 举报

发表于 2006-2-3 22:29:29 | 显示全部楼层
有个问题问问阿.
比如
char* AA;
FILE* pipo;
AA="alksdjflkas"
pipo=popen("command AA(command的参数是AA的内容)","r");
..
..
这个情况怎么实现?
回复

使用道具 举报

 楼主| 发表于 2006-2-3 22:38:51 | 显示全部楼层
[quote:5f6a447e0e="BOoRFGOnZ"]有个问题问问阿.
比如
char* AA;
FILE* pipo;
AA="alksdjflkas"
pipo=popen("command AA(command的参数是AA的内容)","r");
..
..
这个情况怎么实现?[/quote]

实际上就是一个字符串连接的问题,将字符串"command "与AA表示的内容合并成一个字符串B,再执行pipe=popen(B,"r")就是了。
(字符串合并的那命令忘记了
回复

使用道具 举报

发表于 2006-2-3 23:04:41 | 显示全部楼层
哦 这样解决阿       
回复

使用道具 举报

 楼主| 发表于 2006-2-4 16:17:28 | 显示全部楼层
关于管道,可以参考 unix高级环境编程
回复

使用道具 举报

发表于 2006-2-8 12:26:50 | 显示全部楼层
破碎细胞, 你那个最后崩溃的地方  改成
[code:1]for(i=0;i<=row_count-1;i++)//从clist_file_list中获取播放列表信息,并写入文件
                {
                gtk_clist_get_text(clist_file_list,i,1,&path);
                fprintf(fp,"file://%s/",path);
                gtk_clist_get_text(clist_file_list,i,0,&file_name);
                fprintf(fp,"%s\n",file_name);
                }[/code:1]
把 你的 **path 和**file_name  定义成*path *file_name ...   好像 可以解决..
你试一试吧
回复

使用道具 举报

 楼主| 发表于 2006-2-18 19:44:59 | 显示全部楼层
谢谢BOoRFGOnZ

我把path和file_name前改成&号以后程序就正常了

至于那个** 是参照gtk api手册上指示的做的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-2 22:36 , Processed in 0.040296 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表