声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 6250|回复: 17

[编程技巧] 请问:如何将字符串引用到创建的txt文件名上?

[复制链接]
发表于 2009-1-6 11:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
我在写txt文件时,用的是
fid=fopen('路径\文件名.txt','wt');
fprintf=(fid,'输出的数据格式\n',变量名);
fclose(fid);
我想问,新创建的txt文件能不能用我m文件里的一个字符串来代替,这样我做很多个文件写出的时候,就不用一个一个起文件名了。
另外,在导入文件的时候load(' ')单引号里面是不是也可以直接调用字符串来代替?
不知道我把问题说明白了没有
哪位好心人能给我指导一下。
回复
分享到:

使用道具 举报

发表于 2009-1-6 11:30 | 显示全部楼层
新创建的txt文件完全可以由字符串来产生:
fid=fopen([filepath filename  '.txt'],'wt');
其中filepath是路径,例如为'D:\Matlab\',而filename是文件名,filepath和filename都必须是字符串常数,同时注意在[ ]中各字符串之间要有空格。

评分

1

查看全部评分

发表于 2009-1-6 11:40 | 显示全部楼层

回复 楼主 不爱陌生人 的帖子

参考下
doc uigetfile
doc uiputfile
发表于 2009-1-9 19:36 | 显示全部楼层
建议楼主好好学学eval函数   这个函数应该可以实现你的目的
 楼主| 发表于 2009-1-12 16:15 | 显示全部楼层

回复 沙发 songzy41 的帖子

谢谢,我前几天有些别的事,这个就先放下了
我试过你说的命令,出错,我再试试
我其实就是想让一个文件能自己导入数据,然后计算,再导出。但是文件命名的问题解决不了的话,我就得一个一个自己来。
不过还是谢谢你
 楼主| 发表于 2009-1-12 16:17 | 显示全部楼层

回复 地板 tigerhead099 的帖子

谢谢,我那天也考虑了用eval这个函数,可能是我的书不太详细,我还没弄的太明白,我再试试看看帮助的信息吧。
 楼主| 发表于 2009-1-12 16:57 | 显示全部楼层

回复 沙发 songzy41 的帖子

你好,我刚才又试了下你说的命令,出错
后来我把fid=fopen([filepath filename  '.txt'],'wt');改成:
fid=fopen([' filepath filename  .txt'],'wt');
这样可以运行了,可是和不加[ ] 没有分别,中间还是不能引用一个数组上的变量来命名文件名,我又试了eval 变量名(n)的方法还是不行
 楼主| 发表于 2009-1-12 17:01 | 显示全部楼层

回复 地板 tigerhead099 的帖子

我刚才看看了eval的命令,我也试了下,不能满足我的要求,我不是只简单地要求输出一个字符串,我是在fid=fopen(' ')中直接用数组中的一个元素来命名文件名。
eval好象只能把一个数组上的变量输出到屏幕上,但是在'  '中是不生效的。
 楼主| 发表于 2009-1-12 17:06 | 显示全部楼层

回复 板凳 ChaChing 的帖子

我看了下
doc uigetfile
doc uiputfile
其中uiputfile是可以把一个字符串作为文件名直接保存,但是要造路径,而且还是没有解决直接引用变量自动作为文件名的问题。
发表于 2009-1-12 20:11 | 显示全部楼层
原帖由 不爱陌生人 于 2009-1-12 16:57 发表
回复 沙发 songzy41 的帖子
你好,我刚才又试了下你说的命令,出错
后来我把fid=fopen([filepath filename  '.txt'],'wt');改成:
fid=fopen([' filepath filename  .txt'],'wt');
这样可以运行了,可是和不加[ ] 没有分别,中间还是不能引用一个数组上的变量来命名文件名,我又试了eval 变量名(n)的方法还是不行

看来楼主没有完全理解我的意思。我在这里举一个例子,说明在程序中怎么用字符串构成名,同时每次循环中改变文件名:
filepath='D:\Matlab\';
for l=1 : 17
x=load([filepath 'out' num2str(l) '.txt']);
y=load([filepath 'zjout' num2str(l) '.txt']);
.
.
end
在每次循环中读入的都是不同的文件。
发表于 2009-1-12 21:17 | 显示全部楼层

回复 9楼 不爱陌生人 的帖子

善用uigetfile/uiputfile可以让程式多样变化!
譬如资料处理要选定档案, 可借由uigetfile取得路径/档名, 如此可任意选目录档案, 程式比较一般化! 甚至於可以取消选取, 进入另一处理过程!
LZ试试下! 没给资料, 自己适宜修改!

TitleS = 'Choise the file (Cancel to Quit from Data Process) :'; [FileName,PathName] = uigetfile('*.mat',TitleS);
if FileName==0, beep; disp('File not ready ?'); break;
else load([PathName, FileName]); end

DefName = ['zzz77.mat'];  TitleS = 'Enter the filename to save :';
[FileName,PathName] = uiputfile(DefName,TitleS)
if FileName~=0, save([PathName,FileName],'Var1','Var2','Var3'); end
发表于 2009-1-13 15:30 | 显示全部楼层

回复 楼主 不爱陌生人 的帖子

不知道是我的理解是不是正确,你是不是想把一些名字保存在一个数组上面,这样写多个文件就不用去一一写了是不是。那么要是这样的话。可以仿效如下写法。
这个会同时生成100个.txt文件
a = 2;
for i = 1:100
    s ='XX_t.txt' ;
    s =subs(s,'XX_t',i);
    s =char(s);                %字符型
  fid = fopen( s,'wt');
    fprintf(fid,'%d\n',a);
    fclose(fid);
end

例外,要是想同时生成多个文件夹也有如下的方法(这个是我看别人写的)
for i=1:100
s=strcat('mkdir foldername',int2str(i));
system(s);
end
但是 这个用要有两点要注意,一是mkdir和 foldername之间的空格。二是
如果你指定保存盘符路径的话如: s=strcat('mkdir E:\MATLAB program\自动创建多个文件\XX',int2str(i));
那么是逐级生成文件夹从E开始(如果文件夹没有创立的话)

[ 本帖最后由 Billow 于 2009-1-13 15:33 编辑 ]
 楼主| 发表于 2009-1-15 16:50 | 显示全部楼层
感谢大家的回复~~
以上各位给出的回复我都一一尝试了,可能是我自己的问题,也可能由于是版本的问题,有一些办法我没有运行成功。不过最后问题还是解决了,总结一下写在下面,也算是对以上各位的一个答谢吧:

循环导入文件:
1.文件名是顺序数字
filepath='路径';     %例:filepath='D:\new\';
for i=1:n
    A(i)=load([filepath num2str(i) '.txt']);
end
2.如果文件名里有字符
filepath='路径';
for i=1:n
    A(i)=load([filepath 'in' num2str(i) '.txt']);   %'in'只是举个例子,可以替换为需要的字符
end
3.如果文件名是不规律的数字,且已经存在于一个数组内
以'namelist'为数组名为例
filepath='路径';
for i=1:n
    A(i)=load([filepath num2str(list(i)) '.txt']);   %'in'只是举个例子,可以替换为需要的字符
end
**注意:filepath、num2str命令及'.txt'之间必须有空格
             如果不加filepath也可以,但是所加载文件须与当前m文件在相同路径中

循环写出文件:
其实循环写出文件和导入是相似的:
1.如果写出文件是顺序数字为文件名
filepath='路径';     %如果不写路径,将会在matlab当前默认的路径上创建文件
for i=1:n
    fid=fopen([filepath num2str(i) '.txt'],'wt');
    fprintf(fid,'格式',变量名);
    fclose(fid);
end
2.同导入,如果文件名中需要有字符
其他命令不变,
fid=fopen([filepath 'out' num2str(i) '.txt'],'wt');
3.如果写出文件的文件名在一个数组里,且为纯数字的数组,以outlist为例:
fid=fopen([filepath num2str(outlist(i) '.txt')],'wt');
4.如果写出文件的文件名有字符,应该存在一个元胞数组内:
outlist={'out456','outw87'......};
其他命令不变
fid=fopen([filepath outlist{i} '.txt'],'wt');
%%也可以在元胞数组内把后缀名也写上,这样就不用在fid中写'.txt'了。
%%例:outlist={'out456.txt','outw564.txt',.....};
fid=fopen([filepath outlist{i}],'wt');

[ 本帖最后由 不爱陌生人 于 2009-1-15 17:03 编辑 ]

评分

1

查看全部评分

发表于 2009-1-15 21:11 | 显示全部楼层
原帖由 不爱陌生人 于 2009-1-15 16:50 发表
...如果文件名是不规律的数字...

如果文件名是不规律的(不一定仅数字不规律)!
可以将要处理的档案, 全摆在一个档案中, 利用dir指令取得相对应档名, 这样程式会更一般化, 无需每次因档名不同更改程式!
 楼主| 发表于 2009-1-21 15:32 | 显示全部楼层

回复 14楼 ChaChing 的帖子

楼上的ChaChing我看了你建议,并且看了eight总结的txt文本的帖子,还有个小问题:
file=dir('*.txt');
我用file(i).name可以得到文件名,是有后缀的
我用[pathstr,name,ext,versn]=fileparts(file)可以分别得到路径,文件名,后缀,和‘’,这时的name就仅是文件名了,我想问的是:要是只想得到文件名,其他不要,你知不知道前面的括号应该怎么写?我的意思是哪种写法可以省略pathstr这些命令
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-5-2 14:52 , Processed in 0.055079 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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