找回密码
 注册
Simdroid-非首页
查看: 226|回复: 16

gui中提取edit中的字符串到txt文件

[复制链接]
发表于 2010-12-21 22:04:00 | 显示全部楼层 |阅读模式 来自 四川成都
小程序摘自别人的程序,程序见附件。
就主要问题是在读入txt文件时,出现问题。
如在edit中输入:
11 12 13 14 15 16
22 23 24 25 26 27
33 34 35 36 37 38
能够成功吗?
在生成的txt文件中,会产生按列书写的状况。什么原因?
希望在txt文件书写方式和在edit中一样。
代码应该怎么改下?忘各位大侠帮忙解答。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
发表于 2010-12-21 22:26:03 | 显示全部楼层 来自 北京
Simdroid开发平台
可以看看这个链接,也许有帮助:
http://forum.simwe.com/viewthread.php?tid=642138
感觉就是eval和普通文件读写命令的组合。
回复 不支持

使用道具 举报

发表于 2010-12-21 23:14:06 | 显示全部楼层 来自 上海
原始文件下载下来看了一下,整个M文件结构太凌乱,一点也不简洁。因此用这种方式做GUI,很不方便。

原始代码如下:
str=get(handles.con,'String')
dir=handles.dir;
fin=fopen(dir,'wt');
fprintf(fin,'%s',str);
fclose(fin);


首先要设置这个edit的max属性大于1,这样就可以输入多行数据了。
仅仅做简单的修改:
EditString = get(handles.con,'String') ;
if ischar( EditString  )
    EditString = { EditString  } ;
end

fid = fopen(dir,'wt');
if fid == -1
    warndlg( '文件被占用,无法写入数据。' ) ;
    return ;
end

for num = 1: length(EditString )
    % 逐行打印编辑框中的文本内容。
    fprintf( fid,'%s', EditString{num} );
end

fclose(fid);

helpdlg( '输出成功' ) ;


本地没有matlab,无法调试,如有bug,请多多包涵。

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2010-12-21 23:26:16 | 显示全部楼层 来自 北京
本帖最后由 bainhome 于 2010-12-21 23:28 编辑

难得cwit老兄有闲给出指点,有机会会仔细调整一下这个程序。其实给首帖发文人的主要是最后一个处理txt文本排列的子程序,隐约想起自己好像做过。毕竟那是我2005年那会儿初学GUI的作品,甚至我现在的电脑上都没这个程序了,还得从论坛上再down回去,算忆往昔的怀旧情绪作祟了...
回复 不支持

使用道具 举报

 楼主| 发表于 2010-12-21 23:28:35 | 显示全部楼层 来自 四川成都
2# bainhome         可能是我没表述清楚,我是想将edit中的字符串保存到txt文件中去。师兄你那个例子是将数据读入到edit中。师兄学结构的,真是巧了。
       还有个问题问你。你用句柄写的gui,写的很规整,很有层次感。那些控件的大小和位置都摆的很好。请问师兄怎么做到的?在cad中排的版吗?
回复 不支持

使用道具 举报

发表于 2010-12-21 23:34:45 | 显示全部楼层 来自 北京
我已经不是学结构的了,这就是东一榔头西一棒子的教训,惭愧...
主要我想说明的就是最后一个formatoutput子程序,既然这个方法可以处理txt→edit中的内容,类似处理何不拿来搞搞edit→txt?
至于句柄写的这个GUI,是我学半年MATLAB后第一个自觉像样的GUI习作,里面的控件大小和位置是大致估算,然后不停编译得到的,很是费了些劲。笨人笨办法,不值一提。
回复 不支持

使用道具 举报

 楼主| 发表于 2010-12-22 01:10:42 | 显示全部楼层 来自 四川成都
3# cwit cwit老师,麻烦你了。哈哈,我也是感觉就是读入txt文件时,有问题。按照你的思路,按行读入文件。但是还是出现了同样的问题,生成的txt文件,还是是一列一列读出来的,最后成了一行。很乱。不知道什么原因?
回复 不支持

使用道具 举报

发表于 2010-12-22 16:16:56 | 显示全部楼层 来自 上海
哈哈,一个bug,逐行写入数据时没有换行。

for num = 1: length(EditString )
    % 逐行打印编辑框中的文本内容。
    fprintf( fid,'%s\r\n', EditString{num} );
end
回复 不支持

使用道具 举报

 楼主| 发表于 2010-12-22 18:56:54 | 显示全部楼层 来自 四川成都
8# cwit cwit老师,还是不行。还是只有一行,而且读的时候是一列一列读的。
您如果有程序可以帮忙调试下。
回复 不支持

使用道具 举报

发表于 2010-12-22 20:44:22 | 显示全部楼层 来自 北京
昨天因为没时间看你的原帖,看你一直强调按列读,我就很奇怪,“转置”这两个字在嘴边绕梁半天最后还是忍住没说,毕竟没做。
今天看了看你的程序,觉得十分简单,虽然是edit→txt,但比我给你那个参考程序里txt→edit更简单:一个str2num就搞定了。如果是你给定的示例数据的话。
  1. str=get(handles.con,'String')
  2. str=str2num(str);
  3. dir=handles.dir;

  4. fin=fopen(dir,'wt');
  5. fprintf(fin,'%6.2f %6.2f %6.2f %6.2f %6.2f %6.2f\n',str');
  6. fclose(fin);
复制代码

其中格式的设定可以按维数自行循环创建字符串格式其余参考cwit给的开头设定。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
回复 不支持

使用道具 举报

 楼主| 发表于 2010-12-22 21:43:01 | 显示全部楼层 来自 四川成都
10# bainhome 师兄,就是不知道一定那种格式的。也有可能是有矩阵,还有字符串。
自己想编一个程序,将结果出在edit中,然后保存。
不一定是每一行的格式都是一样的。
象fprintf(fin,'%s\r\n',str),不知道为什么有问题。
用下面的做例子:
11 12 13 14 15 16
22 23 24 25 26 27
33 34 35 36 37 38
能成功吗?

得到的结果

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
回复 不支持

使用道具 举报

发表于 2010-12-23 02:16:54 | 显示全部楼层 来自 北京
本帖最后由 bainhome 于 2010-12-23 02:28 编辑

今天晚上尝试了一种比较另类的思路,利用windows剪贴板作为桥梁,并使用批处理工具nircmd.exe,彻底实现对edit中文本的完整复制。
1.下载附件并解压缩;
2.双击其中的nircmd.exe文件,将其添加至windows路径(对话框上有按钮,一看就知道),实际上就是设置路径的全局变量
3.MATLAB中运行getedit.m
4.点击最上面设置路径的按钮,随意设置存放data.txt文件的路径
5.在剪贴板中随便写点儿东西,中文,英文,拉丁文,希伯来语,维语...无论写什么信息,全选这些内容,右键→复制或者快捷键ctrl+C之类
6.点击界面上的“写入txt”按钮,该路径下多一个批处理文件和一个data.txt,打开看看。
=================================================================================
说明:没做任何考虑其他情况的调试,只保证剪贴板内文字随便粘贴,其他意外情况我没有去想,你自己调吧。原理就是用fprintf生成一个批处理文件,至于为什么用nircmd这个小工具,实在是因为它太爽了!
=================================================================================

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2010-12-23 09:42:30 | 显示全部楼层 来自 湖南湘潭
统一按字符串数组处理,一行一行地写入txt文本即可。

  1. % --- Executes during object creation, after setting all properties.
  2. function con_CreateFcn(hObject, eventdata, handles)
  3. % hObject handle to con (see GCBO)
  4. % eventdata reserved - to be defined in a future version of MATLAB
  5. % handles empty - handles not created until after all CreateFcns called

  6. % Hint : edit controls usually have a white background on Windows.
  7. % See ISPC and COMPUTER.
  8. if ispc && isequal(get(hObject, 'BackgroundColor'), get(0, 'defaultUicontrolBackgroundColor'))
  9.     set(hObject, 'BackgroundColor', 'white');
  10. end

  11. % --- Executes on button press in pb.
  12. function pb_Callback(hObject, eventdata, handles)
  13. % hObject handle to pb (see GCBO)
  14. % eventdata reserved - to be defined in a future version of MATLAB
  15. % handles structure with handles and user data (see GUIDATA)

  16. str = get(handles.con, 'String')
  17. dir = handles.dir;
  18. fin = fopen(dir, 'wt');
  19. for k = 1:size(str, 1)
  20.     fprintf(fin, '%s\n', str(k,:));
  21. end
  22. fclose(fin);
复制代码

评分

1

查看全部评分

回复 不支持

使用道具 举报

 楼主| 发表于 2010-12-23 11:47:38 | 显示全部楼层 来自 四川成都
多谢师兄bainhome的耐心解答,给我提供了一种好的思路。
lin2009的正解,解开了我的疑问。对上面的各位前辈一并表示感谢!
就这个例子说说我的感悟。本人的一点自己的想法,如有不对请指正。
我一直认为在edit中写的几行字符串是1×n的一行字符串
实际上,当你设定max>1后,
多行字符串成为字符矩阵。
写入txt中就应该当成字符矩阵来处理。
这就是为什么直接读取的时候为什么会是一列一列写了。

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2010-12-23 12:10:42 | 显示全部楼层 来自 北京
本帖最后由 bainhome 于 2010-12-23 13:49 编辑

数据I/O的相关文档,一上来就在反复强调MATLAB使用了C的习惯,默认按列读写,这在taohe的大作中也是反复被说明(ps:那本书真是常做数据读写的人士案头必备,什么时候看都有进益)。因此lin2009用循环把字符矩阵变成1×n,此时由于有且仅有一行,看起是按行,实际按列读的性质未变。
我前面的做的数值矩阵的例子你肯定没仔细看,里面藏有一个小小的转置符号,只是在这种格式随意的字符矩阵中不能乱转置,就需要按照lin2009的方法变通一下。
我是昨天看某个批处理论坛,突发奇想搞了个思路,属邪门歪道,可以不看。不过如果想搞几个软件的协同工作,我觉得学好批处理必不可少,那真的很强大。
当然,需要强调的是,在具体工程中很不推荐大肆这样搞,简简单单的数据,非要在好几个软件间装神弄鬼地传来传去,实实在在的工程弄得花里胡哨却对问题毫无帮助,学好一个软件都很不错了,何况还有那么多其他的实际问题要处理.

评分

1

查看全部评分

回复 不支持

使用道具 举报

 楼主| 发表于 2010-12-23 14:16:29 | 显示全部楼层 来自 四川成都
bainhome师兄,讲的透彻,就是这个道理,哈哈。再次表示感谢!
回复 不支持

使用道具 举报

发表于 2010-12-23 18:12:20 | 显示全部楼层 来自 上海
很抱歉,对edit的属性记错了。lin2009 的方法简单。唯一的补充就是:
'%s\n',这个是软回车。如果用记事本打开,软回车是不换行的,写字板是换行的。
'%s\r\n',这个是硬回车。记事本打开,是一定换行的。

评分

1

查看全部评分

回复 不支持

使用道具 举报

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

本版积分规则

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-5-23 16:15 , Processed in 0.068299 second(s), 23 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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